awk在不同的格式

时间:2016-08-22 03:26:53

标签: awk grep

1       875091  G      GA     GT:AD:DP:BQ:SS:FT:DP4    0/1:.:5:.:1:VarscanHighConfidenceIndel:1,2,1,1
1       948846  T      TA     GT:DP:DP4:BQ:SS:FT:AD    1/1:50:10,0,10,0:.:1:VarscanHighConfidenceIndel:.

您好我需要根据质量提取样品。样品很大,我只显示某些色谱柱。

第5列表示第6列中以':'分隔的值的信息。第5列中还有其他不同的格式,我在这里没有显示。

我需要提取一定价值的样本。例如,我需要DP> 12和SS = 1以及其他格式的其他值。

在第一行中,DP(第5/6列中的第3个元素)为5. SS = 1(元素5)。

在第二行中,DP是第5/6列中的第二个元素,值为50,SS = 1(元素5)

我所做的是对所有类似格式进行分组,然后对它们进行单独的awk命令。

gzip -dc file1.vcf.gz | grep 'GT:AD:DP:BQ:SS:FT:DP4' |awk -F "\t" 'NR>1 {split($6,a,":"); if(a[5]==1 && a[3]>12){print $0}}' 
gzip -dc file1.vcf.gz | grep 'GT:DP:DP4:BQ:SS:FT:AD' |awk -F "\t" 'NR>1 {split($6,a,":"); if(a[5]==1 && a[2]>12){print $0}}' 

我正在寻找一种方法,而不是在不同格式上使用单独的awk,因为第5列中有许多其他不同的格式。

1 个答案:

答案 0 :(得分:3)

您没有提供输入的预期输出,因此它不清楚您想要什么,但解决这些问题的最佳方法是首先创建一个数组,将字段名称映射到它们的值,然后根据需要使用,例如:

$ cat tst.awk
{
     split($5,n,/:/)
     split($6,v,/:/)
     for (i in n) {
        f[n[i]] = v[i]
     }
}
(f["DP"] > 5) && (f["SS"] == 1)

$ awk -f tst.awk file
1       948846  T      TA     GT:DP:DP4:BQ:SS:FT:AD    1/1:50:10,0,10,0:.:1:VarscanHighConfidenceIndel:.