You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:04:57