非常に長いテキストファイルがありますが、ファイルの内容の一部は次のとおりです。
[{"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
各行の一致部分のみを印刷し、grep
Perl-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
答え2
詳しくは、入力ファイルはPythonデータ構造です。特に辞書リストです。閉じ括弧を追加する必要があります。
astモジュールを使用すると、有効なPythonデータ構造である文字列を直列化できます。
python3 -c 'import sys, ast
ifile,key = sys.argv[1:]
str = ""
with open(ifile) as fh:
for l in fh: str += l.rstrip()
lod = ast.literal_eval(str)
for d in lod: print(d[key])
' file uniprot
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
答え3
使用gawk
:
awk 'BEGIN{RS=","}
/uniprot/{print gensub(/.*("uniprot":")(.*)".*/, "\\2", "g") }' input
このコマンドには、RS
カンマで設定されたレコード区切り記号()を入力します。
その後、gawk
組み込み関数はgensub()
backreference()を使用して行を目的のパターンに置き換えます\\2
。
答え4
Perl 5ソリューション
$ perl -nle 'print join"\n",m/uniprot\":\"(.*?)\"/g' file.txt
P12807
P12807
T12807
P12808
Z12809
P12821
P0C918
$