使用awk对每个唯一ID求和或求平均值

use*_*841 3 awk

任何人都可以告诉我如何使用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
Run Code Online (Sandbox Code Playgroud)

每个唯一ID的输出(总计$ 5 $ 6)

NM_01011874 21 1 
NM_00175642 25 2
Run Code Online (Sandbox Code Playgroud)

或每个唯一ID平均4美元

NM_01011874 0.0476
NM_00175642 0.08
Run Code Online (Sandbox Code Playgroud)

此外,如果您可以分解解决方案的组件,我将不胜感激.我是一名生物信息学培训最少的分子生物学家.

Dan*_*n R 7

每个id的第5列和第6列的总和:

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
Run Code Online (Sandbox Code Playgroud)

解释:$ 10是id字段,$ 5和$ 6是我们建立2个数组用于加列5和6列5和6(由字符串索引,所以我们可以使用id字段).在我们处理完所有的行/记录,我们通过数组键(ID字符串)迭代,并打印在该数组的索引值.

每个ID的第4列的平均值:

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
Run Code Online (Sandbox Code Playgroud)

解释:非常类似于求和示例.我们保持每个ID 4列的总和,并且看到每个ID记录数.最后,我们遍历id并打印总和/计数.

我对awk做的不多,我发现Perl对小脚本更好.但是,看起来像一个很好的起点.有更多页面与示例脚本的链接.