2016-10-04 51 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