来自2个不同匹配字段的Awk sum列

时间:2015-05-02 05:28:31

标签: bash shell unix awk

我有一个包含2个不同行标识符的数据集,我想使用2个不同的行标识符获取2个单独列之间的比率,并输出到单独的文件中。

例如:

输入

 Avpr1a CG  1 30
 Avpr1a CHG 2 15
 Avpr1a CHH 1 15
 Avpr1a CG  2 25
 Avpr1a CHG 5 15
 Avpr1a CHH 8 15
 BDNF   CG  1 15
 BDNF   CHG 2 15
 BDNF   CHH 3 10
 BDNF   CG  8 20

我想要的是基于第1列,第2列,得到3美元的总和/ 4美元的总和的比例来获得以下(例如AVPR1a CG 3/55 = 0.05)

输出

 Avpr1a CG  0.05
 Avpr1a CHG 0.233
 Avpr1a CHH 0.3
 BDNF   CG  0.xxx
 BDNF   CHG 0.xxx
 BDNF   CHH 0.xx

你明白了。

我目前通过单独汇总列,合并和划分

来实现真正的愚蠢
awk '{a[$1,$2]+=$3}END{for(i in a){print i, a[i]}}'
awk '{a[$1,$2]+=$4}END{for(i in a){print i, a[i]}}'
merge
awk and print $3/$4 from intermediate files

是否有可能在单个awk命令中实现我想要做的事情?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,它甚至相当容易:

awk '{s1[$1,$2] = $1; s2[$1,$2] = $2; s3[$1,$2] += $3; s4[$1,$2] += $4}
     END { for (i in s3) print s1[i], s2[i], s3[i]/s4[i] }' data

输出:

Avpr1a CG 0.0545455
BDNF CHG 0.133333
BDNF CHH 0.3
Avpr1a CHG 0.233333
BDNF CG 0.257143
Avpr1a CHH 0.3

如果您没有捕获s1s2中的单独项目,而是打印i,则会输出\034字符,将两个名称文件分开。您可以使用tr来修复此问题,但不需要这样做更简单。