Portál AbcLinuxu, 19. července 2025 19:05


Dotaz: výběr řádků textu

15.7.2019 11:33 Honza
výběr řádků textu
Přečteno: 379×
Odpovědět | Admin
Potřeboval bych pomoct se zpravováním textových souborů. Mám dva textové soubory, kdy v jednom (CP002667.1.txt) je seznam kontigů (kusů DNA), které patří konkrétnímu bakteriálnímu druhu. Čísla kontigů jsou oddělena řádky.

Ve druhém souboru (G7_ml200contigs.fa) jsou vlastní kontigy, které ovšem patří více bakteriálním druhům. Potřebuji z něho tedy vyextrahovat jen některé kontigy, jejichž seznam je v prvním souboru.

Struktura souboru s kontigy, tedy kusy DNA patřící různým druhům je následující: první řádek je popis s číslem kontigu, následuje RÚZNÝ počet řádků s vlastní sekvencí DNA:

>contig00001 lenght=194432

ATTTAATGCCTCCACCACTAACGTTGAATCGTGCTGTTTCTGCAATCGCCAACCAACCAC TTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA

.

.

.

>contig00002 lenght=187674

TGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCA ATACAGAATTCAGTCCTTAAAATAACAGTCTAACTTTTCGGGGTCAGATCACAGTAATAG

.

.

.

Kdyby byl počet řádků sekvence DNA stejný, šlo by to grepem (tady dostanu první řádky sekvence):

grep -F -f CP002667.1.txt -A 2 G7_ml200contigs.fa > CP002667.1first2seqlines.txt

Jak mám ale dostat celou sekvenci kontigu, když má proměnlivý počet řádků (i několik tisíc)? Potřeboval bych nějak říct grepu, aby pokračoval s výběrem řádků za vyhledaným patternem (-A) až do dalšího hlavičkového řádku uvozeného >contig0000X.

Díky, Honza
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.7.2019 12:22 nn
Rozbalit Rozbalit vše Re: výběr řádků textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vstup foo.txt:
>contig00001 lenght=194432
ATTTAATGCCTCCACCACTAACGTTGAATCGTGCTGTTTCTGCAATCGCCAACCAACCAc
BBGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
CTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
DTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
>contig00002 lenght=187674
ETGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
FTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
GGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCB
>contig00003 lenght=187674
HTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
IGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCB
Regexp:
sed -n -e '0,/>contig00002/d;/>contig00003/q;p' foo.txt
Vystup:
ETGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
FTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA
GGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCB
15.7.2019 12:23 V.
Rozbalit Rozbalit vše Re: výběr řádků textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli jsem to dobře pochopil ...
pokud mam čísla řádků, kde se co nachází (=klíč), tak sed by mi měl to, co je mezi tim, dokázat vyexportovat - aneb sed '2,4!d' somefile.txt. jen musim ověřit aktuální meze.
15.7.2019 13:07 Honza
Rozbalit Rozbalit vše Re: výběr řádků textu
Příklad

Mám soubor s kontigy:

>contig00001 len=194432

ATTTAATGCCTCCACCACTAACGTTGAATCGTGCTGTTTCTGCAATCGCCAACCAACCAC

TTGACGCCGCGCCAGGTTCATCACGATTGCTAAATAATGCCATTCCCCCTGTACCTTCAA

>contig00002 len=187674

TGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCA

ATACAGAATTCAGTCCTTAAAATAACAGTCTAACTTTTCGGGGTCAGATCACAGTAATAG

>contig00003 len=113760

AATTATTTAATTTGCCATGTTTCTTTATTTCTGCACTTTGGCAAAATGGGCAGTTTTTTA

TTCATATTTCAAAAAGAGGGCTTAAAGCCTTGTACTATAAGGCTTTAAGCCACTTTTTAG

a potřebuji z toho dostat kontig 2, včetně hlavičkového řádku.

>contig00002 len=187674

TGTTCGTTATTACAATGAGGAAAGAATACAATTAAAATTAAATGGACTGAGCCCTGTTCA

ATACAGAATTCAGTCCTTAAAATAACAGTCTAACTTTTCGGGGTCAGATCACAGTAATAG

Problém je, že v reálu je v souboru kontigů několik set a seznam kontigů pro výběr několik desítek. Neznám rozsah řádků pro výběr.
15.7.2019 14:18 V.
Rozbalit Rozbalit vše Re: výběr řádků textu
Takže máte ale v jednom souboru formát 1) "klíč podle kterého mohu hledat", 2) data (x řádků), 3) další klíč, podle kterého mohu hledat?
Takže "grep -n klíč zdroj" a pak extrahuju sedem od indexu k indexu.
Nebo tohle fakt nejde?
15.7.2019 14:32 Honza
Rozbalit Rozbalit vše Re: výběr řádků textu
"grep -n klíč zdroj" funguje:

grep -F -f CP002667.1.txt -A 2 G7_ml200contigs.fa > CP002667.1first2seqlines.txt

To vypíše první dva řádky sekvence kontigů podle seznamu v souboru CP002667.1.txt. Jak ale zapojit do toho sed, aby mě vypsal všechy řádky (proměnlivý počet) sekvence za klíčovým slovem (názvem kontigu) až do hlavičkového řádku dalšího kontigu?
15.7.2019 14:39 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: výběr řádků textu

Doporučuji vybodnout se na sed a použít awk.

Josef Kufner avatar 15.7.2019 13:46 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: výběr řádků textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vybodni se na Bash a Grep. Načti si to do polí objektů v Pythonu a udělej, co potřebuješ. Ušetří ti to spoustu času až budeš chtít další trochu komplikovanější chování. Shell na tohle není stavěný. Navíc ti to otevře další možnosti vizualizace a pokročilého zpracování.
Hello world ! Segmentation fault (core dumped)
15.7.2019 14:26 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: výběr řádků textu
Odpovědět | | Sbalit | Link | Blokovat | Admin

Šel bych na to tak, že bych napsal awk skript:

Skript by měl být spustitelný:

chmod +x contig.awk

Skript bere soubor se seznamem hlaviček jako argument (proměnnou) key_file, zatímco velký soubor, ze kterého má vyfiltrovat sekvence, bere jako standardní vstup a píše pak na standardní výstup.

Když budu mít následující dva soubory, …

…spustím to celé takto:

./contig.awk -v key_file=keys.txt < contigs.txt

To^^^ mi vypíše (celé) dvě sekvence z contigs.txt podle klíčů v keys.txt, včetně těch klíčů a bez ohledu na délku sekvencí. Pokud jsem zadání správně pochopil, tohle by mělo být ono.

Samozřejmě by sis to musel trochu upravit v případě, že formát souborů umožňuje prázdné řádky a/nebo komentáře.

15.7.2019 14:52 Honza
Rozbalit Rozbalit vše Re: výběr řádků textu
Super, tohle dělá přesně to co potřebuju. Díky moc za pomoc. I všem ostatním.
15.7.2019 15:08 PetebLazar
Rozbalit Rozbalit vše Re: výběr řádků textu
A pokud by to snad nekoho z mistnich zajimalo, v prikladu patrne slo mj. o bakterii "Gallibacterium anatis UMN179". ;-)
15.7.2019 17:25 Honza
Rozbalit Rozbalit vše Re: výběr řádků textu
Bingo! Blast rulezzzz (https://blast.ncbi.nlm.nih.gov/Blast.cgi)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.