
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.annotations
von in einer anderen Datei ausdrucken . Die Datei, in der ich nach dem Muster suche, ist:KEGG.annotations
allKO.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.txt
Datei, also wirread 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) ausallKO.txt
, mit einem Leerzeichen am Ende, aber ohne abschließende Zeilenumbruch. - Durchsuche (
grep
) dieKEGG.annotations
Datei nach der ID (fünftes Feld ab Zeile vonallKO.txt
). Dabei handelt es sich um vollständige Zeilen (inkl. Zeilenumbrüche). - Wenn dies
grep
fehlschlägt, schreiben Sie eine neue Zeile, da diesprintf
nicht 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”.