任何人都可以告诉我如何使用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的输出(总计$ 5 $ 6)
NM_01011874 21 1
NM_00175642 25 2
或每个唯一ID平均4美元
NM_01011874 0.0476
NM_00175642 0.08
另外,如果您可以分解解决方案的组件,我将不胜感激。我是一名生物信息学培训最少的分子生物学家。
答案 0 :(得分:5)
每个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
解释:$ 10是id字段,$ 5和$ 6是第5列和第6列。我们构建了2个数组,用于对第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
解释:与求和示例非常相似。我们保留每个id的第4列的总和,以及每个id所看到的记录数。最后,我们遍历id并打印总和/计数。
我对awk做的不多,我发现Perl对于小脚本更好。但this看起来是一个很好的起点。有更多页面的链接和示例脚本。