テキストファイルから特定のIDを解析する方法は?

テキストファイルから特定のIDを解析する方法は?

非常に長いテキストファイルがありますが、ファイルの内容の一部は次のとおりです。

[{"site":"1a2v_1","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_2","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_3","pfam":"Cu_amine_oxid","uniprot":"T12807"},{"site":"1a2v_4","pfam":"Cu_amine_oxid","uniprot":"P12808"},{"site":"1a2v_5","pfam":"Cu_amine_oxid","uniprot":"Z12809"},{"site":"1a2v_6","pfam":"Cu_amine_oxid","uniprot":"P12821"},{"site":"1a3z_1","pfam":"Copper-bind,SoxE","uniprot":"P0C918"},

上記のテキストファイルのIDを解析する必要があり、uniprot予想される結果は次のとおりです。

P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

同じタスクを実行するために次のコマンドを試しましたが、何も機能しませんでした。

sed -e 's/"uniprot":"\(.*\)"},{"site":"/\1/' file.txt
cat file.txt | sed 's/.*"uniprot":" //' | sed 's/"site":".*$//'

上記のIDを分析するのに役立ちます。

よろしくお願いします。

ベストアンサー1

Linuxシステムを使用している場合は、次のことを非常に簡単に実行できます。

$ grep -oP '"uniprot":"\K[^"]+' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

-o各行の一致部分のみを印刷し、grepPerl-P準拠の正規表現を有効にすることを示します。正規表現は探していますが、"uniprot":"削除します(つまり、\K「これまで一致するすべての項目を削除」して出力に含まれないことを意味します)。次に、"()ではなく最も長いセグメントを見つけます[^"]+


もちろんこれはJSONデータのように見えるため、より複雑な場合は適切なパーサーを使用する必要がありますjq。たとえば、終了ステートメントを追加してファイルを変更し、]次のようにします。

[{"site":"1a2v_1","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_2","pfam":"Cu_amine_oxid","uniprot":"P12807"},{"site":"1a2v_3","pfam":"Cu_amine_oxid","uniprot":"T12807"},{"site":"1a2v_4","pfam":"Cu_amine_oxid","uniprot":"P12808"},{"site":"1a2v_5","pfam":"Cu_amine_oxid","uniprot":"Z12809"},{"site":"1a2v_6","pfam":"Cu_amine_oxid","uniprot":"P12821"},{"site":"1a3z_1","pfam":"Copper-bind,SoxE","uniprot":"P0C918"}]

あなたはできます:

$ jq -r '.[].uniprot' file
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918

おすすめ記事