2016-07-20 4 views
0

Ich habe eine 2 Dateien. Eine ist eine Fasta-Datei, die mehrere Fasta-Sequenzen enthält, während eine andere Datei die Namen von Kandidatensequenzen enthält, die ich durchsuchen möchte (Datei Beispiel unten).AWK verwenden, um Fasta-Datei zu durchsuchen, gegeben eine zweite Datei mit Sequenznamen

seq.fasta

>Clone_18 
GTTACGGGGGACACATTTTCCCTTCCAATGCTGCTTTCAGTGATAAATTGAGCATGATGGATGCTGATAATATCATTCCCGTGT 
>Clone_23 
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 
>Clone_27-1 
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC 
>Clone_27-2 
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTCGTTTTGTTCTAGATTAACTATCAGTTTGGTTCTGTTTGTCCTCGTACTGGGTTGTGTCAATGCACAACTT 
>Clone_34-1 
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCG 
>Clone_34-3 
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCGATATCGCTGAAGCCCAATC 
>Clone_44-1 
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCC 
>Clone_44-3 
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCCCGGCAGCGCAGCCGTCGTCTCTACCCTTCACCAGGAATAAGTTTATTTTTCTACTTAC 

name.txt

Clone_23 
Clone_27-1 

Ich möchte AWK verwenden, durch die fasta Datei zu suchen und erhalten alle fasta Sequenzen für bestimmte Kandidaten, deren Namen gespeichert in eine andere Datei.

awk 'NR==FNR{a[$1]=$1} BEGIN{RS="\n>"; FS="\n"} NR>FNR {if (match($1,">")) {sub(">","",$1)} for (p in a) {if ($1==p) print ">"$0}}' name.txt seq.fasta 

Das Problem ist, dass ich nur die Reihenfolge der ersten Kandidaten in name.txt extrahieren kann, wie dieses

>Clone_23 
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 

Kann ich jemand helfen über einzeiligen awk zu beheben?

+0

Sie haben die Frage radikal geändert, nachdem die Antworten gepostet wurden. Ich habe das zurückgerollt. Bitte posten Sie in diesem Fall eine neue Frage. (Und zeigen Sie, was Sie aus den Antworten, die Sie hier erhalten haben, anzupassen versucht haben) – hek2mgl

+0

Ich kann nur 1 Frage in 90 Minuten posten. Kann ich ein neues Beispiel in der Answer-Sitzung posten? – user2993059

+0

Nun, es empfiehlt tatsächlich, Kommentare zu verwenden oder Frage erneut zu bearbeiten (da ich Format verwenden muss, um das Beispiel zu zeigen) – user2993059

Antwort

2

Wenn es in Ordnung oder sogar erwünscht ist und den Namen zu drucken, können Sie einfach grep verwenden:

grep -Ff name.txt -A1 a.fasta 
  • -f name.txt Picks Muster von name.txt
  • -F behandelt sie als Zeichenketten statt regulären Ausdrücke
  • A1 druckt die übereinstimmende Zeile plus die folgende Zeile

Wenn die Namen nicht in der Ausgabe gewünscht würde ich einfach Rohr zu einem anderen grep:

above_command | grep -v '>' 

Eine awk Lösung kann wie folgt aussehen:

awk 'NR==FNR{n[$0];next} substr($0,2) in n && getline' name.txt a.fasta 

besser in einer mehrzeiligen Version erklärt :

# True as long as we are reading the first file, name.txt 
NR==FNR { 
    # Store the names in the array 'n' 
    n[$0] 
    next 
} 

# I use substr() to remove the leading `>` and check if the remaining 
# string which is the name is a key of `n`. getline retrieves the next line 
# If it succeeds the condition becomes true and awk will print that line 
substr($0,2) in n && getline 
+1

Hmm, ich frage mich, was das machen wird, wenn die getline fehlschlägt ... ;-). Wenn Sie getline verwenden müssen (Hinweis - Sie nicht hier), dann schützen Sie sich zumindest vor Fehlern mit 'if ((getline line)> 0) Zeile drucken. Siehe http://awk.freeshell.org/AllAboutGetline. –

+0

Hey.Ich habe darüber nachgedacht, aber ich dachte, dass es kein Problem ist, denn wenn "getline" in diesem Fall fehlschlägt, ist das Fasta-Format kaputt und es enthält tatsächlich nicht die Sequenz. Ist es nicht? – hek2mgl

+0

Ok, ich verstehe. In diesem Fall würde es den Namen drucken, der nicht gewünscht ist. Nehmen wir an, die Fasta-Datei ist korrekt! ;) – hek2mgl

2
$ awk 'NR==FNR{n[">"$0];next} f{print f ORS $0;f=""} $0 in n{f=$0}' name.txt seq.fasta 
>Clone_23 
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 
>Clone_27-1 
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC 
+0

Wenn eine Sequenz in mehrere Zeilen unterteilt ist, kann der obige Befehl nur die erste Zeile lesen. Deshalb habe ich die Standard-RS geändert. Siehe geändertes Beispiel oben – user2993059

+0

Ich sehe in Ihrem Beispiel keine Änderungen. Es wäre trivial, diese Lösung für mehrzeilige Datensätze zu optimieren, aber ich bin nicht geneigt, dies zu tun, da ich mir nicht vorstellen kann, warum Sie diese Information in Ihrer Frage und in Ihrem Beispiel nicht in die erste aufgenommen hätten Stelle aber - ich hoffe, dass es offensichtlich ist, dass wir das Format des Dateiinhalts kennen müssen, um eine Datei analysieren zu können! Haben Sie noch weitere Überraschungen für den Gebrauch, wie zum Beispiel mehrere aufeinanderfolgende Zeilen oder .... Posten Sie eine neue Frage mit genauer Eingabe/Ausgabe und wir werden sie von dort aus nehmen. –

Verwandte Themen