Grep zum Suchen von Mustern in einer Datei

Grep zum Suchen von Mustern in einer Datei

Ich möchte grepMuster aus einer Datei in einer zweiten suchen. Meine Musterdatei sieht ungefähr so ​​aus:

K02217
K07448
KO8980

Die zu durchsuchende Datei ist:

>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

Der Befehl, den ich ausprobiert habe, lautet:

fgrep --file=pattern.txt file.txt >> output.txt

Dies druckt die Zeilen von file.txt, in denen das Muster gefunden wurde. Ich brauche es, um auch eine Spalte mit dem gefundenen Muster auszudrucken. Also so etwas wie:

K07448 mrr; restriction system protein Mrr; K07448 restriction system
K02217 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

Kann mir jemand einen Tipp geben, wie das geht?

Antwort1

Wenn Sie nichts gegen eine zusätzliche Spalte mit einer Zahl darin haben, können Sie hierfür joinund verwenden.grep

$ join <(grep -of patterns.txt file.txt | nl) \
       <(grep -f patterns.txt file.txt | nl)
1 KO3322 proteinaseK (KO3322)
2 KO3435 Xxxxx KO3435;folding factor
3 KO3435 Yyyyy KO3435,xxxx

Antwort2

Sie können eine Shell-Schleife verwenden:

$ while read pat; do 
    grep "$pat" file | 
        while read match do 
            echo -e "$pat\t$match"
        done
 done < patterns 
KO3435  Xxxxx KO3435;folding factor
KO3435  Yyyyy KO3435,xxxx
KO3322  proteinaseK (KO3322)

Ich habe es getestet, indem ich es auf der UniProt-Flatfile für Menschen (625 MB) ausgeführt und 1000 UniProt-IDs als Muster verwendet habe. Auf meinem Pentium i7-Laptop hat es ungefähr 6 Minuten gedauert. Als ich nur nach 100 Mustern gesucht habe, hat es ungefähr 35 Sekunden gedauert.


Wie in den Kommentaren weiter unten erwähnt, können Sie dies etwas beschleunigen, indem Sie die - und -Befehle überspringen und Optionen echoverwenden :grep--label-H

$ while read pat; do 
    grep "$pat" --label="$pat" -H < file
done < patterns

Wenn Sie dies auf Ihre Beispieldateien anwenden, wird Folgendes erzeugt:

$ while read pat; do 
    grep "$pat" --label="$pat" -H < kegg.annotations; 
  done < allKO.IDs.txt > test1
terdon@oregano foo $ cat test1 
K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein

Antwort3

Sie könnenack:

$ ack "$(tr '\n' '|' < pattern.txt | sed -e 's/.$//')" --print0 --output='$& $_' file.txt
KO3322 proteinaseK (KO3322)
KO3435 Xxxxx KO3435;folding factor
KO3435 Yyyyy KO3435,xxxx

verwandte Informationen