複数のファイルからファイル名と文字列を抽出する

複数のファイルからファイル名と文字列を抽出する

特定の文字列とファイル名自体を抽出したいファイルがたくさんあります(> 100,000)。ファイルは次のように構成されます。

ファイル名:sequence.php?ID=gi|90022703|ref|YP_528530.1|

[Random text]

Description: Xylanase/Chitin Deacetylase-Like Protein [Saccharophagus Degradans 2-40]
Source: NCBI-Bacteria
Species: Saccharophagus degradans 2-40

Taxonomy: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

ファイル名(ID =の後のすべての項目が望ましい)とファイルから「分類」の後のすべての項目を抽出したいと思います。

それは次のとおりです。

gi|90022703|ref|YP_528530.1| Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

可能ですか? (複数のファイルでも機能します。つまり、それぞれの新しい情報をテキスト出力ファイルに追加します。)

答え1

複数のファイルを処理する場合は、一致するgrep項目の前に各ファイル名を印刷します。正規表現を検索する必要がないため、この-Fオプションを使用して固定文字列を検索できます(速度が速い)。この-rオプションはgrep再帰操作を示します。この-rオプションはGNUバージョンなので、grep他のバージョンのgrepがインストールされているシステムでは機能しません。

grep -r -F 'Taxonomy' /path/to/directory

これにより、次の行が表示されます。

sequence.php?ID=gi|90022703|ref|YP_528530.1|:Taxonomy: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

これを目的の出力に調整する方法はいくつかありますcut

grep -r -F 'Taxonomy' /path/to/directory | cut -d = -f 2 | cut -d : -f 1,3

その後、行を次のように変更する必要があります。

gi|90022703|ref|YP_528530.1|: Bacteria; Proteobacteria; Gammaproteobacteria; Alteromonadales; Alteromonadaceae; Saccharophagus

これは説明する内容とまったく一致しません。| tr -d :本当にコロンを削除したい場合は、チューブの端をそこに置くことができます。最後に、出力をファイルにリダイレクトします。

grep -r -F 'Taxonomy' /path/to/directory | cut -d = -f 2 | cut -d : -f 1,3 > file.txt

>>ファイルを上書きする代わりにファイルに追加するには>

答え2

awk '/^Taxonomy:/{t=FILENAME; sub(/^.*\?ID=/, x, t); $1=t; print; close(FILENAME)}' /files/location/* > output.txt

関連情報