从 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

获取awk '{split($6,a,/;/); split(a[1],b,/=/); print b[1]}' file所有 AF 条目(如预期),但我不确定如何提取其余的键。我如何a在第二次分裂中通过整个?

答案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

相关内容