Frage:
So konvertieren Sie eine Fasta-Datei in eine durch Tabulatoren getrennte Datei
AudileF
2017-10-17 16:00:10 UTC
view on stackexchange narkive permalink

Ich habe eine Fasta-Datei wie

  >sample 1-Gen 1atgc>sample 1-Gen 2atgc>sample 2-Gen 1 atgc  

Ich möchte die folgende Ausgabe mit erhalten eine Unterbrechung zwischen dem Header und der Sequenz.

  >sample 1 Gen 1 atgc>sample 1 Gen 2 atgc>sample 2 Gen 1 atgc  
Vielen Dank an alle. Sie machen es schwer zu wählen. Ich wollte etwas für ein mehrzeiliges Fasta, damit sowohl Terdon- als auch Chris-Skripte korrekt sind. Also werde ich mich auf das Sprichwort "Wer zuerst kommt, mahlt zuerst" verlassen.
Acht antworten:
terdon
2017-10-17 17:21:48 UTC
view on stackexchange narkive permalink

Wenn Sie wie üblich über mehrzeilige Fasta-Dateien verfügen, können Sie diese Skripte 1 sup> verwenden, um zwischen fasta und tbl (Sequenzname <TAB> Sequenz) zu konvertieren:

  • FastaToTbl

      #! / usr / bin / awk -f {if (substr ($ 1 , 1,1) == ">") if (NR>1) printf "\ n% s \ t", substr ($ 0,2, Länge ($ 0) -1) sonst printf "% s \ t", substr ($ 0 , 2, Länge ($ 0) -1) sonst printf "% s", $ 0} END {printf "\ n"}  
  • TblToFasta ​​p>

      #! / usr / bin / awk -f {Sequenz = $ NF ls = Länge (Sequenz) ist = 1 fld = 1 während (fld < NF) {if (fld == 1) {printf ">"} printf "% s" , $ fld if (fld == NF-1) {printf "\ n"} fld = fld + 1} while (ist < = ls) {printf "% s \ n", substr (Sequenz, ist, 60) ist = is + 60}}  
  • Speichern Sie diese in Ihrem $ PATH , machen Sie sie ausführbar, und Sie können dann Folgendes tun:

      $ cat file.fa>sequence1 ATGCGGAGCTTAGATTCTCGAGATCTCGATATCGCGCTTATAAAAGGCCCGGATTAGGGCTAGCTAGATATCGCGATAGCTAGGGATATCGAGATGCGATACG>sequence2 GTACTCGATACGCTACGCGATATTGCGCGATACGCATAGCTAACGATCGACTAGTGATGCATAGAGCTAGATCAGCTACGATAGCATCGATCGACTACGATCAGCATCAC $ FastaToTbl file.fa Sequence1 ATGCGGAGCTTAGATTCTCGAGATCTCGATATCGCGCTTATAAAAGGCCCGGATTAGGGCTAGCTAGATATCGCGATAGCTAGGGATATCGAGATGCGATACGsequence2 GTACTCGATACGCTACGCGATATTGCGCGATACGCATAGCTAACGATCGACTAGTGATGCATAGAGCTAGATCAGCTACGATAGCATCGATCGACTACGATCAGCATCAC  

    Und , um die Fasta zurückzubekommen:

      $ FastaToTbl file.fa | TblToFasta>sequence1 ATGCGGAGCTTAGATTCTCGAGATCTCGATATCGCGCTTATAAAAGGCCCGGATTAGGGCTAGCTAGATATCGCGATAGCTAGGGATATCGAGATGCGATACG>sequence2 GTACTCGATACGCTACGCGATATTGCGCGATACGCATAGCTAACGATCGACTAGTGATGCATAGAGCTAGATCAGCTACGATAGCATCGATCGACTACGATCAGCATCAC  

    Dies kann ein sehr nützlicher Trick sein, wenn Sie eine Fasta-Datei nach einer Zeichenfolge durchsuchen:

      TblToFasta file.fa | grep 'foo' | FastaToTbl  

    Wenn Sie wirklich den führenden > des Headers behalten möchten (was nicht sehr nützlich zu sein scheint), können Sie so etwas tun :

      $ perl -0pe 's / \ n // g; s / .> / \ n> / g; s / $ / \ n /; ' file.fa >sequence1 ATGCGGAGCTTAGATTCTCGAGATCTCGATATCGCGCTTATAAAAGGCCCGGATTAGGGCTAGCTAGATATCGCGATAGCTAGGGATATCGAGATGCGATAC>sequence2 GTACTCGATACGCTACGCGATATTGCGCGATACGCATAGCTAACGATCGACTAGTGATGCATAGAGCTAGATCAGCTACGATAGCATCGATCGACTACGATCAGCATCAC  

    Aber das wird die gesamte Datei in den Speicher gelesen. Wenn dies ein Problem ist, fügen Sie zwischen jedem Fasta-Datensatz eine leere Zeile ein und verwenden Sie dann den Absatzmodus von Perl, um jeden "Absatz" (Sequenz) gleichzeitig zu verarbeiten:

      perl -pe 's / > / \ n> / 'file.fa | perl -00pe 's / \ n // g; s / .> / \ n> / g; s / $ / \ n /; ' 

    1 sup> Dank an Josep Abril, der diese Skripte vor mehr als einem Jahrzehnt geschrieben hat. sub>

    Chris_Rands
    2017-10-18 02:43:19 UTC
    view on stackexchange narkive permalink

    Es gibt eine sehr einfache BioPython -Lösung, die minimal und lesbar ist und mehrzeilige Fasta verarbeitet:

      aus dem Bioimport SeqIO für die Aufzeichnung in SeqIO.parse ('example.fa', 'fasta'): print ('> {} \ t {}'. Format (record.description, record.seq))  
    Pierre
    2017-10-17 16:53:41 UTC
    view on stackexchange narkive permalink

    Angenommen, es gibt nur eine Sequenzzeile pro Datensatz, verwenden Sie Einfügen mit zwei 'stdin'

      cat your.fasta | Einfügen - -  
    Beachten Sie, dass dies fehlschlägt, wenn Sie mehrzeilige Sequenzen haben (wie Pierre betont hat), aber auch, wenn die Datei leere Zeilen enthält. Möglicherweise möchten Sie auch das [UuOC] (http://catb.org/jargon/html/U/UUOC.html) entfernen: `paste - -
    Karel Brinda
    2017-10-26 01:51:42 UTC
    view on stackexchange narkive permalink

    Sie können folgende Befehle verwenden:

      perl -pe / > (. *) / > \ 1 \ t / g; s / \ n // g; s / > / \ n> / g 'sequence.fa | grep -v '^ $'  

    Erläuterung:

    1. Hängt jeder Kopfzeile eine Registerkarte an
    2. Alle Zeilen verbinden
    3. Teilen Sie die einzelne erhaltene Zeile durch das Zeichen '>'
    4. Entfernen Sie die leere Zeile (die erste Zeile ist leer, da '>' das erste Zeichen der FASTA-Datei ist)
    5. ol>
    bli
    2017-10-19 14:04:02 UTC
    view on stackexchange narkive permalink

    Ein sehr nützliches Werkzeug für diese Art der Datenmanipulation ist bioawk:

      $ bioawk -c fastx '{print ">" $ name "" $ comment "\ t" $ seq} 'test.fa>sample 1 Gen 1 atgc>sample 1 Gen 2 atgc>sample 2 Gen 1 atgc  

    bioawk basiert auf awk und bietet zusätzliche Analysefunktionen. Hier sagen wir, dass das Format fasta oder fastq mit -c fastx ist, und dies macht den $ name (zwischen ">" und dem ersten Leerzeichen) $ comment (nach dem ersten Leerzeichen) und $ seq (die Sequenz in einer Zeile), die in awk-Anweisungen verfügbar sind.

    Siehe zum Beispiel diese Antwort für einen anderen Anwendungsfall.

    Konrad Rudolph
    2017-10-17 21:45:11 UTC
    view on stackexchange narkive permalink

    Wenn möglich, empfehle ich die Verwendung einer dedizierten Parsing-Bibliothek, anstatt einen Parser zusammen zu hacken: Wie Sie in den anderen Antworten sehen können, wird das Parsen selbst einfacher Formate ziemlich schnell komplex, wenn Sie Wert auf Korrektheit legen.

    Hier ist ein kleines R-Skript, das mit 'seqinr' das tut, was wir brauchen:

      #! / Usr / bin / env RscriptsuppressPackageStartupMessages (library (seqinr)) parsed = read.fasta (Datei ('stdin'), as.string = TRUE) table = data.frame (unlist (parsed), row.names = sapply (parsed, attr, 'Annot ')) write.table (Tabelle, stdout (), sep =' \ t ', quote = FALSE, col.names = FALSE)  

    Speichern Sie es als fasta-to -tsv , machen Sie es ausführbar und verwenden Sie es wie folgt:

      fasta-to-tsv < input.fasta > output.tsv  

    Äquivalenter Code ähnlicher Länge kann in Python oder Perl geschrieben werden.

    Können Sie auch erklären, welche Pakete installiert werden müssen, damit R dies tut? `seqinr` ist nicht Teil von Vanilla R.
    @terdon Ich bin etwas verwirrt: "seqinr" * ist * der Paketname, also muss dieser installiert werden.
    Manchmal stimmt der Name des Pakets nicht mit der Bibliothek überein, die Sie daraus laden. Und auf jeden Fall, da R das schrecklich komplizierte Durcheinander ist, kann man nie wissen (oder ich kann es sowieso nicht), ob das Paket mit `install.package` installiert werden kann oder über einen Bioconductor oder was auch immer gemacht werden muss kann der Fall sein. Die Verwaltung von R-Paketen ist alles andere als trivial. Daher hielt ich es für nützlich, zu erklären, wie die zur Ausführung Ihres Codes erforderlichen Pakete installiert werden. Ich habe den Befehl jetzt bearbeitet. Ich würde zustimmen, aber ich habe es bereits 2017 getan :)
    @terdon „Manchmal stimmt der Name des Pakets nicht mit der Bibliothek überein, die Sie daraus laden.“ - Nein, für R ist dies per Definition immer der Fall. In Bezug auf die Installation gebe ich Ihnen an, dass es einen Sonderfall für Pakete gibt, die nicht in CRAN enthalten sind, aber es ist nur wirklich sinnvoll, die Ausnahmen zu formulieren, nicht die Regel. Sie würden keine Installationsanweisungen für Perl-Pakete unter CPAN oder für Python unter PyPI, NPM für JavaScript oder Rust-Kisten erwähnen. Ich habe Ihre Bearbeitung rückgängig gemacht, weil (a) sie redundant ist und (b) sie falsch war. ** Installieren Sie niemals Pakete über "sudo R", es sei denn, Sie sind der Systemadministrator, der einen Cluster verwaltet.
    Ah, ich habe es ohne versucht, aber es ist fehlgeschlagen, als ich versucht habe, es in der lokalen Bibliothek meines Benutzers zu installieren. Daher habe ich angenommen, dass das Paket nur systemweit installiert werden kann. Dies zeigt jedoch nur, warum es hilfreich ist, den Installationsbefehl einzuschließen. Ich kenne R nicht (und hasse es aus Leidenschaft), also sind all diese Dinge, die Sie erwähnen und die für Sie offensichtlich sind, nicht für mich. Und möglicherweise auch andere, weshalb ich in meinen Antworten immer Befehle zum Installieren von Paketen einbinde.
    burger
    2017-10-17 19:20:52 UTC
    view on stackexchange narkive permalink

    Leere Datensätze entfernen (Beschreibung ohne Reihenfolge):

      awk '$ 2 {print RS} $ 2' FS = '\ n' RS = \ > ORS = f1.fa > f2.fa.  

    Leerzeilen entfernen:

      sed '/ ^ $ / d' f2.fa > f3.fa  

    Konvertieren Sie mehrzeiliges Fasta in einzeiliges Fasta:

      awk '/ ^ > / {printf ("\ n% s \ n", $ 0); next; } {printf ("% s", $ 0);} END {printf ("\ n");} 'f3.fa > f4.fa  

    Schließlich @Pierre-Lösung:

      cat f4.fa | Einfügen - - > f.txt  
    Daniel Standage
    2019-05-23 20:39:34 UTC
    view on stackexchange narkive permalink

    In Fällen, in denen kein Sequenzumbruch erfolgt und jede Sequenz nur eine einzelne Zeile belegt, ist der folgende Shell-Befehl wahrscheinlich der schnellste, einfachste und bequemste.

      Einfügen - - < your.fasta > your.new.fasta  ​​code> 
    Hoppla, es sieht so aus, als hätte Pierre dies bereits vorgeschlagen. :-)


    Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
    Loading...