ファイル内のパターンを検索するためのGrep

ファイル内のパターンを検索するためのGrep

1 つのファイルのパターンを 2 番目のファイルで検索するために使用したいと思いますgrep。パターン ファイルは次のようになります。

K02217
K07448
KO8980

検索するファイルは次のとおりです:

>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

試したコマンドは次のとおりです。

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

これは、パターンが見つかった file.txt の行を出力します。見つかったパターンの列も出力する必要があります。次のようになります。

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

誰か私にやり方を教えてもらえますか?

答え1

数字が入った追加の列が問題ない場合は、joinと を使用し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

答え2

シェルループを使用できます:

$ 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)

私は、これをヒトの UniProt フラット ファイル (625 MB) で実行し、1000 個の UniProt ID をパターンとして使用してテストしました。私の Pentium i7 ラップトップでは約 6 分かかりました。100 個のパターンのみを検索した場合は約 35 秒かかりました。


以下のコメントで指摘されているように、 と をスキップし、とオプションechoを使用すると、これを少し高速化できます。grep--label-H

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

これをサンプル ファイルで実行すると、次の結果が生成されます。

$ 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

答え3

使用できますああ:

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

関連情報