Nach Muster suchen und Zeile an eine andere Datei anhängen

Nach Muster suchen und Zeile an eine andere Datei anhängen

Ich habe eine Datei wie diese (fünf durch Tabulatoren getrennte Spalten)

head allKO.txt
Metabolism Carbohydrate metabolism Glycolisis K07448
Metabolism Protein metabolism protesome K02217

und ich möchte in der Datei nach dem Muster (String) in Spalte 5 suchen und, wenn es gefunden wird, sowohl die Zeile , in der das Muster gefunden wurde, als auch alle Spalten KEGG.annotationsvon in einer anderen Datei ausdrucken . Die Datei, in der ich nach dem Muster suche, ist:KEGG.annotationsallKO.txt

head KEGG.annotations
>aai:AARI_24510  proP; proline/betaine transporter; K03762 MFS transporter, MHS family, proline/betaine transporter
>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
>aai:AARI_28260  hypothetical protein
>aai:AARI_29060  ABC drug resistance transporter, inner membrane subunit; K09686 antibiotic transport system permease protein
>aai:AARI_29070  ABC drug resistance transporter, ATP-binding subunit (EC:3.6.3.-); K09687 antibiotic transport system ATP-binding protein
>aai:AARI_29650  hypothetical protein
>aai:AARI_32480  iron-siderophore ABC transporter ATP-binding subunit (EC:3.6.3.-); K02013 iron complex transport system ATP-binding protein [EC:3.6.3.34]
>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein

Ich möchte so etwas:

Metabolism Carbohydrate metabolism Glycolisis K07448 >aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system
Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

Beachten Sie, dass der >aai:AARI_33320 mrr; restriction …an die erste Zeile angehängte Text die achte Zeile von ist KEGG.annotations, die Folgendes enthält K07448(das ist das ID-Feld (fünftes Feld) aus der ersten Zeile von allKO.txt).

Wie kann ich diesen Code ändern, um meine Musterdatei zu verwenden? Dies funktioniert mit einer Musterdatei mit nur einer Spalte, die das zu suchende spezifische Muster enthält.

while read pat; do
    grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1

Antwort1

Sie können mit dem Code arbeiten, den Sie bereits haben. Speichern Sie die Zeile in einem Array und suchen Sie nach dem fünften Element:

while read -r line; do
    [ -z "$line" ] && continue
    patlist=($line)
    pat=${patlist[4]}
    grep "$pat" --label="$line" -H < KEGG.annotations
done < allKO.txt

kehrt zurück:

Metabolism Carbohydrate metabolism Glycolisis K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein
Metabolism Protein metabolism protesome K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

Antwort2

Dies scheint das zu tun, was Sie verlangen:

while read w1 w2 w3 w4 ID
do
    printf "%s " "$w1 $w2 $w3 $w4 $ID"
    if ! grep "$ID" KEGG.annotations
    then
        echo
    fi
done < allKO.txt

Dadurch wird die Ausgabe auf den Bildschirm geschrieben. Fügen Sie der letzten Zeile eine output( >)-Umleitung (z. B. > test1) hinzu, um die Ausgabe in einer Datei zu erfassen.

  • Basierend auf Ihren Beispielen ist das Schlüssel-/ID-Feld („Muster“) dasfünftevonfünfFelder in der allKO.txtDatei, also wir read w1 w2 w3 w4 ID. Sie sagen, dies ist eine tabulatorgetrennte Datei; ich gehe davon aus, dass keines der Felder Leerzeichen enthält.
  • Schreiben Sie ( printf) die Zeile (also die Felder) aus allKO.txt, mit einem Leerzeichen am Ende, aber ohne abschließende Zeilenumbruch.
  • Durchsuche ( grep) die KEGG.annotationsDatei nach der ID (fünftes Feld ab Zeile von allKO.txt). Dabei handelt es sich um vollständige Zeilen (inkl. Zeilenumbrüche).
  • Wenn dies grepfehlschlägt, schreiben Sie eine neue Zeile, da dies printfnicht der Fall war.
  • Dies führt dazu, dass Zeilen, deren ID nicht vorhanden ist, KEGG.annotations einfach in die Ausgabe geschrieben werden:

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This ID doesn’t exist: K99999
    

    und IDs, die mehr als einmal vorkommen, werden als zusätzliche Zeilen geschrieben (ohne die Daten aus zu wiederholen allKO.txt):

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This is a hypothetical additional line from KEGG.annotations that mentions “K02217”.
    

verwandte Informationen