awk基于分隔符从多列中选择和求和值

时间:2016-10-04 21:22:20

标签: bash awk vcf

我有一个包含数百万行和约400个制表符分隔列的大文件(vcf)。下面粘贴了一些列数较少的行:

1/1:0,0,0:0:0,0,0,0    1/1:0,0,0:0:0,0,0,0     1/1:37,3,0:1:0,0,1,0    1/1:0,0,0:0:0,0,0,0

我想用分隔符:拆分每一列并打印第四组值(col 0的0,0,0,0; ​​col 2的0,0,0,0; ​​0,每列的0,1,0表示第3列;依此类推)。

所以,期望的输出是:

Col1      Col2        Col3      Col4      ..   Coln
0,0,0,0   0,0,0,0     0,0,1,0   0,0,0,0   ..   a,b,c,d

对于awk来说,这太疯狂吗?我更喜欢在awk中这样做,因为我的文件在我们的unix服务器中。我可以在R中做到这一点,虽然我可以想象它花了很多时间来阅读文件,拆分每一栏,处理等等。所以我很感激任何帮助。感谢。

可选:为了使这个更难,可以将四个值中的前两个数相加,并将四个值中的最后两个相加以获得value1,value2列?也许我问的太多了。抱歉。在这种情况下,以下是所需的输出:

Col1  Col2    Col3  Col4  ..   Coln 
0,0   0,0     0,1   0,0   ..   a+b,c+d

2 个答案:

答案 0 :(得分:0)

awk救援!

$ awk '{for(i=1;i<=NF;i++) 
          {sub(/.*:/,"",$i); 
           split($i,a,","); 
           $i=a[1]+a[2] "," a[3]+a[4]}}1' file


0,0 0,0 0,1 0,0

添加列标题也不是那么难......

为标签分隔的输出字段设置-v OFS='\t'

答案 1 :(得分:0)

awk 'NR==1{
        for(i=1;i<=NF*2;i+=2){           #print first line because one column is become two column so NF*2
            printf "val"i"\tval"i+1"\t"
        }
        print "";
      } 
     {
        for(i=1;i<=NF;i++) {
        match($i,".*(.,.),(.,.)$",a);    #match function matches  first two numbers of the four values 
        printf a[1]"\t"a[2]"\t";         #and the last two of the four values
    }
    print "";
    }' file