基于Unix系统awk工具实现按类别计算平均值
按类别计算平均值的Awk解决方案
针对你给出的成对类别-数值数据,我们可以用Awk的关联数组来实现按类别分组计算平均值,完美适配不同类别出现次数不同的场景。
核心命令
假设你的数据保存在input.txt文件中(或直接通过管道输入),执行以下命令:
awk '{for(i=1; i<=NF; i+=2) {sum[$i]+=$(i+1); count[$i]++}} END {for(c in sum) print c, sum[c]/count[c]}' input.txt
命令详解
让我们拆解一下这个命令的逻辑:
- 遍历字段对:
for(i=1; i<=NF; i+=2)循环处理每一行的所有字段,每次步进2,i指向类别字段,i+1指向对应的数值字段,刚好匹配你数据里"类别 数值 类别 数值..."的格式。 - 累加总和与计数:
sum[$i]+=$(i+1):用关联数组sum存储每个类别的数值总和,数组的键就是类别编号(1、2、3)。count[$i]++:用另一个关联数组count记录每个类别出现的次数。
- 输出结果:
END块在所有数据处理完成后执行,遍历sum数组的每个类别键,输出类别编号和对应的平均值(总和除以次数)。
验证结果
用你提供的输入数据测试,输出完全符合预期:
1 0.53625 2 0.540667 3 0.7578
(注:类别2的平均值实际是1.622/3≈0.540667,和你预期的0.5406是四舍五入后的结果,可根据需求用printf格式化输出,比如printf "%d %.4f\n", c, sum[c]/count[c]来保留四位小数)
扩展:如果数据是每行一对的情况
如果你的数据格式是每行一个类别和数值(比如:
1 0.456 1 0.847 ...
),命令可以简化为:
awk '{sum[$1]+=$2; count[$1]++} END {for(c in sum) print c, sum[c]/count[c]}' input.txt
内容的提问来源于stack exchange,提问作者godines
相关产品推荐
相关产品推荐

