awk 按分隔符分割列

awk 按分隔符分割列

我几乎从这里得到答案awk 按分隔符分割并取第一个条目 但需要最后的帮助。我有一个文件:

chr1    283 C       T       0.0     PASS    AF=0.730769;AO=19;DP=26;FAO=19;FDP=26;FDVR=5;FR=.;FRO=7;FSAF=12;FSAR=7;
chr1    296 A       G       0.0     PASS    AF=0.6;AO=6;DP=10;FAO=6;FDP=10;FDVR=10;FR=.;FRO=4;FSAF=3;FSAR=3;
chr1    393 CACA    ACCA    0.0     PASS    AF=0.266667,0.266667;AO=4,4;DP=16;FAO=4,4;FDP=15;FDVR=5,5;FR=.,.,.,.,HEALED,HEALED;FRO=2;FSAF=0,0;FSAR=4,4;

我需要将最后一列拆分为“;”然后“,”并提取各个部分。我想提取 AF、FSAF 和 FSAR 条目,如果有重复条目,则取第一个条目。我有以下内容,但这可能不是最好的方法(而且我还没有弄清楚如何在同一行上完成所有这些操作):

awk '{split($13,a,/;/); split(a[1],b,/,/); print b[1]}'

awk '{split($13,a,/;/); split(a[9],c,/,/); print c[1]}'

awk '{split($13,a,/;/); split(a[10],d,/,/); print d[1]}' 

答案1

你的问题并不完全清楚(请参阅下面我的评论),但是,假设“有双重条目的地方取第一个条目”,你的意思是FOO=bar每行都有重复的条目,我认为这可能就是你想要做的(在每个 Unix 机器上的任何 shell 中使用任何 awk):

$ cat tst.awk
BEGIN { OFS=";" }
{
    delete f
    n = split($7,subFlds,/;/)
    for (i=1; i<=n; i++) {
        tag = val = subFlds[i]
        sub(/=.*/,"",tag)
        sub(/,.*/,"",val)
        if ( !(tag in f) ) {
            f[tag] = val
        }
    }
    print f["AF"], f["FSAF"], f["FSAR"]
}

$ awk -f tst.awk file
AF=0.730769;FSAF=12;FSAR=7
AF=0.6;FSAF=3;FSAR=3
AF=0.266667;FSAF=0;FSAR=4

显然,如果输出分隔符OFS的格式不符合您的要求,您可以将其更改为您喜欢的任何内容。

每当你的数据中有 tag=value 对时,如果你首先创建一个标签数组(也称为名称)到值映射(f[]上面),那么你就可以通过标签打印/测试/修改/任何值你喜欢按你喜欢的顺序。

请注意,即使标签在输入中并不总是以相同的顺序出现,或者某些行中可能缺少某些标签等,上述方法也将起作用。

相关内容