2016-05-03 2 views
0

Ich habe zwei Dateien:awk Last eine Datei in ein Array, Test gegen eine andere Datei

seqs.fa:

>seq000007;size=72768; 
ACTGTGAG 
>seq000010;size=53132; 
GTAAGATC 
GAATTCTT 
>seq00045;size=40321; 
ACCCATTT 
... 

numbers.txt

72768 
53132 

meine gewünschte Ausgabe der sein würde, Zeilen aus der ersten Datei, die mit einer Nummer aus der zweiten Datei übereinstimmen:

>seq000007;size=72768; 
>seq000010;size=53132; 

ich versuchte awk zu verwenden, aber es liefert nur Linien die erste Zahl übereinstimmt, gefunden

awk -F"\n" -v RS=">" 'NR==FNR{for(i=1;i<=NF;i++) A[$i]; next} END {for (header in A) {if (match(header,$1)) {print header}}}' seqs.fa numbers.txt 

seq000007;size=72768; 
seq072768;size=1; 

Warum awk wird nur durch die „Header“ Array für die erste Zeile in numbers.txt Looping? Und wenn dies ein XY problem ist, gibt es einen besseren Weg, dieses Ziel zu erreichen?

Antwort

0

In diesem speziellen Fall können Sie GNU grep wie folgt verwenden:

grep -F -f numbers.txt seqs.fa 

Die Option -f filename nutzt alle in filename für die Suche gefundenen Muster. Die Optionen -F sagt Grep, dass die Muster einfache feste Zeichenfolgen sind.

+2

Note den Tippfehlern in Ihren Zahlen Datei Festsetzung, dass dies jedes Auftreten von Teilzeichenfolgen in der Datei übereinstimmen. – karakfa

2

nach

$ awk -F'=|;' 'NR==FNR{a[$1]; next}; $3 in a' numbers.txt seqs.fa 

>seq000007;size=72768; 
>seq000010;size=53132; 
+0

danke, bearbeitete Frage, um Tippfehler zu entfernen. Dies ergibt die gewünschte Ausgabe. irgendwelche Ideen, warum mein awk Befehl oben nicht funktioniert? – elsherbini

+0

müssen Sie $ 1 im Header nicht umgekehrt, aber es ist ein ineffizienter Ansatz. – karakfa

+0

Ich denke, das ist, was ich tue, der Aufruf ist 'match (string, regex)' (im Gegensatz zu Match-Funktionen, die ich in Python gewohnt bin) [source] (http://www.staff.science.uu.nl /~oostr102/docs/nawk/nawk_92.html) – elsherbini

Verwandte Themen