
特定の文字列とファイル名自体を抽出したいファイルがたくさんあります(> 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