2017-01-12 4 views
-2

Ich frage mich, was der beste Weg ist, einige Zeilen aus einer Fasta-Datei in bash zu entfernen.Bash: Zeilen aus Fasta-Datei entfernen

In dem obigen Beispiel, sagen wir, ich möchte die Zeile entfernen, wo es "GUITH" geschrieben ist, wie entfernen Sie diese Zeile und über Zeilen, bis Sie ein anderes '>' Zeichen finden?

fasta Datei:

>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>O46898_GUITH 
RSLSKGPYIAAHLLKKLNNVDIQKPDVVIKTWSRSSTILPNMVGATIAVYNGKQHVPVYI 
SDQMVGHKLGEFSPTRTFRSH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

fasta Datei, nachdem sie mit bash Filterung:

>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

Es gibt eine andere Version der Frage, aber härter Manipulation. Angenommen, Sie haben eine Datei mit Artnamen haben:

species.txt:

DROMO; 
PLAYO; 

Und Sie wollen Linien in der fasta Datei löschen, in denen Arten im species.txt Dokument nicht vorhanden sind. So erhalten Sie die gleiche Ausgabe wie oben, aber Sie erhalten die Zeilen zu löschen, dank einer anderen Datei (nicht 'GUITH' direkt eingeben). Was wäre der beste Weg, das zu tun?

+0

Haben Sie versucht, etwas? – 123

+0

Ich habe versucht mit Python, das funktioniert, aber es ist nicht optimiert. Und mit bash habe ich etwas mit "sed" probiert, konnte aber nichts finden, was funktionieren würde. – Natha

Antwort

1

In awk:

$ awk '/^>/{p=1} /GUITH/{p=0} p' file 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

Erklärt:

/^>/ { p=1 } # turn print flag up for each record starting with > 
/GUITH/ { p=0 } # turn print flag down for GUITH 
p    # print if p 

Wenn Sie eine Liste der zugelassenen Namen haben wollen:

$ cat list 
DROMO 
PLAYO 
$ awk 'NR==FNR{a[$1];next} /^>/{n=split($0,b,"_"); p=(b[n] in a)} p' list file 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH 

Erklärt:

NR==FNR { a[$1]; next }     # read the list to array a 
/^>/ { n=split($0,b,"_"); p=(b[n] in a) } # take the word after _ and if in a, enable print 
p           # if p, print 
+0

Vielen Dank, die erste Lösung funktioniert einwandfrei, und die netten Erklärungen! Allerdings bekomme ich diesen Fehler, wenn ich aus der Liste der zugelassenen Namen versuche: 'awk: illegales Feld $(), Name" i "'. Weißt du, wo es herkommen könnte? – Natha

+0

Ja, es gab einen Tippfehler, es sollte sein: 'NR == FNR {a [$ 1]; weiter} ', nicht' $ i' wie es ursprünglich war. Was für eine awk verwendest du? Auf Mac? –

1

die Leitung zu entfernen, wo es geschrieben ist 'GUITH':

sed 's/>/\n&/' fasta.txt | sed '/_GUITH/,/^$/d' | sed '/^$/d' 

Um Zeilen in der fasta Datei zu löschen, wo Arten sind nicht in den species.txt:

Mit GNU sed und bash:

sed 's/>/\n&/' fasta.txt | sed -n -f <(sed 's/;$//;s|.*|/_&$/,/^$/p|' species.txt) | sed '/^$/d' 

Ausgang:

 
>B4KSI7_DROMO 
RGLKRKPMALIKKLRKAKKEAPPNEKPEIVKTHLRNMIIVPEMTGSIIGVYNGKDFGQVE 
VKPEMIGHYLGEFALTYKPVKH 
>Q7RT13_PLAYO 
RGIDKKAKSLLKKLRKAKKECEVGEKPKPIPTHLRNMTIIPEMVGSIVAVHNGKQYTNVE 
IKPEMIGYYLGEFSITYKHTRH