2016-10-04 52 views
0

我有一个包含数百万行和〜400个制表符分隔列的大文件(vcf)。与为了简洁的列数少一排被粘贴下面:awk基于分隔符从多列中选择和求和值

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 

我想每一列与所述分隔符分割:并打印所述第四设定值(0,0,0,0为第1栏的;第2列为0,0,0,0;第3列为0,0,1,0;依此类推)。

因此,所需的输出是:

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中完成,不过我可以想象它需要花费大量的时间来阅读文件,分割每一列和处理等,所以我会很感激任何帮助。谢谢。

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

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

_从第10列开始 - 为什么我必须滚动前9列才能看到牛肉?请只发布所需的部分作为输入和所需的输出。 –

+0

@JamesBrown好点。编辑清晰。谢谢。 – berge2015

回答

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'设置为制表符分隔的输出字段。

+0

再次感谢您的救援!很棒。你能否解释第二行'{sub(/.*:/,"",$ i);'所以我可以在将来自己实现类似的任务?谢谢。 – berge2015

+0

明白了。对于所有列,直到':'什么都不做。那么第三行将它存储到数组a中。最后一行检索每个数组的元素并对它们进行求和。 – berge2015

+0

是正确的,因为正则表达式是贪婪的,它会替换直到最后一个冒号,拆分最后一个元素并添加相应的元素,覆盖现有字段,以便可以委托打印。 – karakfa

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