如何获得表中每个组的平均值-最好是在bash (awk)中?



在bash(可能是awk?)中,我如何总结/聚合表(如下所示)以获得每个组的平均值?

grp1 1
grp1 3
grp2 5
grp2 8
grp4 9

awk:

中执行此操作相当简单。
awk '{sum[$1]+=$2; count[$1]++} END {for(key in sum) print key ":  " sum[key]/count[key]}' input_file

示例文件的输出:

grp1: 2
grp2: 6.5
grp4: 9

解释:

  • {sum[$1]+=$2; count[$1]++}:对于输入文件的每一行,我们使用2个关联数组

    • count,存储第一个字段遇到的时间数
    • sum,存储此特定组
    • 的第二个字段的每个值的总和
  • END {for(key in sum) print key ": " sum[key]/count[key]}:当你的文件完成解析时,我们打印每个组,以及该组的sum/count

给定:

cat file
grp1 1
grp1 3
grp2 5
grp2 8
grp4 9

awk '{d[$1]+=$2; cnt[$1]++} END{for (e in d) print e, d[e] / cnt[e]}' file

打印:

grp1 2
grp2 6.5
grp4 9

如果您希望它们都是浮点表示:

awk '{d[$1]+=$2; cnt[$1]++} END{for (e in d) printf("%s %0.2fn", e, d[e] / cnt[e])}'

打印:

grp1 2.00
grp2 6.50
grp4 9.00

知道awk中的关联数组不保持顺序,所以grpX可能会从文件中找到的顺序改变。

最新更新