2013-10-29 76 views
2

任何人都可以告訴我如何使用awk來計算兩個單獨列的總和或每個唯一ID的一列平均值。使用awk對每個唯一ID進行求和或求平均值

輸入

chr1 3661532 3661533 0.0 5 0 chr1 3661529 3662079 NM_01011874  
chr1 3661534 3661535 0.2 5 1 chr1 3661529 3662079 NM_01011874  
chr1 3661537 3661538 0.0 5 0 chr1 3661529 3662079 NM_01011874 
chr1 3661559 3661560 0.0 6 0 chr1 3661529 3662079 NM_01011874 
chr2 4661532 4661533 0.0 8 0 chr1 4661532 4661533 NM_00175642  
chr2 6661534 6661535 0.2 5 2 chr1 6661534 6661535 NM_00175642  
chr2 2661537 2661538 0.0 5 0 chr1 2661537 2661538 NM_00175642 
chr2 9661559 9661560 0.0 7 0 chr1 9661559 9661560 NM_00175642 

輸出,如果你能擊穿爲每個唯一的ID

NM_01011874 21 1 
NM_00175642 25 2 

或平均$ 4爲每個唯一的ID(總結$ 5 $ 6)

NM_01011874 0.0476 
NM_00175642 0.08 

另外,解決方案的組成部分我將不勝感激。我是一位擁有最少生物信息學培訓的分子生物學家。

回答

5

列5的總和和6每個ID:

awk '{sum5[$10] += $5; sum6[$10] += $6}; END{ for (id in sum5) { print id, sum5[id], sum6[id] } }' < /tmp/input 
NM_00175642 25 2 
NM_01011874 21 1 

解釋:$ 10是ID字段中,$ 5和$ 6是第5列和6,我們建立2個陣列求和列5和6(它們是由字符串索引,所以我們可以使用id字段)。一旦我們處理了所有行/記錄,我們遍歷數組鍵(id字符串),並在該索引處打印該值。

平均柱4的每個ID:

awk '{sum4[$10] += $4; count4[$10]++}; END{ for (id in sum4) { print id, sum4[id]/count4[id] } }' < /tmp/input 
NM_00175642 0.05 
NM_01011874 0.05 

解釋:非常相似的求和例子。我們爲每個ID保留第4列的總和,以及爲每個ID查看的記錄數。最後,我們遍歷ID並打印總和/計數。

我對awk沒有太多的瞭解,我發現Perl對於小腳本更好。但this看起來是一個很好的起點。有示例腳本的更多頁面的鏈接。