2017-02-13 7 views
1

Spielen Ich versuche, die Themen this und this Frage zu kombinieren, dh jede Zeichenfolge/Zeile in File2 mit seinem Auftreten passenden (jeder String tritt nur einmal) in File1 während des Druckens der gesamten Zeile, in der es auftritt, in File2, während auch die Zeilen zwischen jeder Übereinstimmung (dh die Sequenz in File2) drucken.awk/sed: passenden Muster zwischen Dateien und Drucken alles zwischen

File1

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01000526.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAAGAU 
UAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAGUGAAAC 
>GAXI01005455.1.1233 Bacteria;Bacteroidetes;Flavobacteriia;Flavobacteriales;Flavobacteriaceae;Chryseobacterium;Tetrodontophora bielanensis (giant springtail) 
CUUUCGAAAGGAAGAUUAAUACCCCAUAACAUA 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 

File2

>GAXI01000525.151.1950 
>GAXI01006199.29.1525 

Was ich habe, so weit:

awk 'FNR==NR{a[$0];next} $1 in a' file2 file1 > output 

die gibt:

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 

Ich möchte dies:

>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 

Die Originaldateien Tausende von Zeilen enthalten, so dass die schnellstmögliche Lösung geschätzt wird, entweder awk, sed oder irgendetwas anderes ...

+1

IMHO Wissenschaftler könnten schnellere und bessere Ergebnisse mit Tools, die für ihre Arbeit entwickelt wurden, erhalten. Die Verwendung von Tools wie https://metacpan.org/release/BioPerl und/oder https://metacpan.org/release/FAST ermöglicht es sicherlich effektiver die Ziele zu erreichen ... – jm666

+0

Sicher, obwohl ich diese Art von nicht mache Anfragen auf einer täglichen Basis. –

Antwort

1

@jO: Versuchen:

awk 'FNR==NR{A[$1];next} ($0 ~ /^>/){Q=""} ($1 in A){Q=1} Q{print}' file2 file1 

EDIT: Hinzufügen einer Erklärung auch hier für die Lösung jetzt.

awk 'FNR==NR  ##### This condition will be TRUE when only file2 is being read. where FNR and NR are the awk's in-built keywords FNR and NR both shows number of lines in a Input_file only difference between them FNR gets RESET when it reads next file and NR keep on increase it's values till all files get read successfully. 
{A[$1];    ##### creating an array named A whose index is $1 first field of file2. 
next}    ##### putting next will skip all the further statements. 
        ##### All further mentioned statements will be executed in file1 only. 
($0 ~ /^>/)   ##### checking if any line is starting with > in file1 
{Q=""}    ##### Making variable named Q as nullified. 
($1 in A)   ##### Checking if current line's $1 is coming into array A, if yes then do following. 
{Q=1}    ##### If current $1 is coming into array A then make variable Q's value to 1. 
Q     ##### Check if Q's value is NOT NULL then do following. 
{print}    ##### print the lines whenever above condition is TRUE which has Q's value is NOT NULL. 
' file2 file1  ##### Mentioning Input_files file2 and file1 here. 
1

können Sie versuchen, mit awk

awk 'FNR==NR{d[$1]; next}/^>/{f=0}$1 in d{f=1}f' file2 file1 

Sie erhalten

 
>GAXI01000525.151.1950 Eukaryota;Opisthokonta;Holozoa;Metazoa (Animalia);Eumetazoa;Bilateria;Arthropoda;Hexapoda;Ellipura;Collembola;Tetrodontophora bielanensis (giant springtail) 
CCUGGUUGAUCCUGCCAGUAGUCAUAUGCUUGUCUCAAA 
GAUUAAGCCAUGCAUGUCUAAGUUCAAGCAAAAAUAAAG 
ACCGCGAAUGGCUCAUUAUAUCAGUUAUGGUUCCUUAGA 
ACUUACUACUUGGAUAACUGUGGUAAUUCUAGAGCUAAU 
>GAXI01006199.29.1525 Bacteria;Chlamydiae;Chlamydiae;Chlamydiales;Simkaniaceae;Candidatus Rhabdochlamydia;Tetrodontophora bielanensis (giant springtail) 
AGAAUUUGAUCUUGGUUCAGAUUGAAUGCUGG 
UGCAAGUCGAACGAAGCUAGAGGGCAACCUCU 
1

Dies könnte für Sie (GNU sed) arbeiten:

sed 's:.*:/^&/bb:' file2 | sed -e ':a' -f - -e 'd;:b;n;/^>/ba;bb' file1 

Trans file2 in den Spielen gedruckt werden om file1, andernfalls löschen Sie die Nicht-Übereinstimmungen.

Verwenden Sie zwei Aufrufe von sed. Der erste verwendet file2, um regexp zu erstellen, der zweite das Framework zum Drucken von Zeilen nach einer Übereinstimmung mit dem nächsten Datensatzanfang oder -ende.

Verwandte Themen