VCFファイルの情報フィールドからすべてのキーを取得する

VCFファイルの情報フィールドからすべてのキーを取得する

この質問は以前の回答に関連しています。awkを区切り文字で除算し、最初の項目を取得します。-

VCFファイル(タブ区切り形式)の場合:

chr1    28374C       T       0.0     PASS    AF=0.730769;AO=19;DP=26;
chr1    29631A       G       0.0     PASS    AF=0.6;AO=6;DP=10;ALLELEID=1396033;
chr1    39322CAC    ACC      0.0     PASS    AF=0.266667,0.266667;AO=4,4;DP=16; 

次の出力を取得したい。

AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

期待どおりにすべてのAFアイテムをインポートしますが、awk '{split($6,a,/;/); split(a[1],b,/=/); print b[1]}' file残りのキーを抽出する方法がわかりません。a2番目の分割でコンテンツ全体をどのように渡しますか?

答え1

POSIX awkを使用してください。

$ awk -F'[[:space:]=;]+' '{for (i=6; i<NF; i+=2) print $i}' file
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

答え2

awkを使用してください。

$ awk '{ n=split($6, tmp, /=[^;]*;/); for(i=1; i<n; i++) print tmp[i] }' infile
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

または、次のように、任意の文字または単一のSplit()呼び出しで列6を分割します。;=

awk '{ n=split($6, tmp, /[=;]/); for(i=1; i<n; i+=2) print tmp[i] }' infile

その後、次のようにキー値を印刷することもできます。

$ awk '{n=split($6, tmp, /[=;]/); for(i=1; i<n; i+=2) print tmp[i], tmp[i+1] }' infile
AF 0.730769
AO 19
DP 26
AF 0.6
AO 6
DP 10
ALLELEID 1396033
AF 0.266667,0.266667
AO 4,4
DP 16

答え3

パイプで簡単にしましょう :

$ awk '{print $6 | "grep -oP \042[A-Z]+(?==)\042"}' file

または

$ awk '{print $6}' file | grep -oP '[A-Z]+(?==)'
AF
AO
DP
AF
AO
DP
ALLELEID
ID
AF
AO
DP

正規表現の一致は次のとおりです。

説明する
[A-Z]+ すべての文字:「A」〜「Z」(1回以上)
(?= 視野以下があることを確認してください。
= =
) プレビュー終了

答え4

awk および tr コマンドを使用します。

$ awk '{print $6}' infile | tr "=" ";" | awk -F";" '{for (i=1;i<NF;i++) {if(i%2){print $i}}}'
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

関連情報