3

Can anyone tell me how to use awk in order to calculate the sum of two individuals columns or the average of one column for each unique ID.

Input

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

Output (sum $5 $6) for each unique ID

NM_01011874 21 1 
NM_00175642 25 2

or average of $4 for each unique ID

NM_01011874 0.0476
NM_00175642 0.08

Also, if you could breakdown the components of the solution I would be grateful. I'm a molecular biologist with minimal bioinformatics training.

4

1 回答 1

8

每个 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 更适合小型脚本。但这看起来是一个很好起点。有更多带有示例脚本的页面的链接。

于 2013-10-30T00:49:57.707 回答