awk计算文件某列平均值需累加该列数值再除以有效行数,关键在于初始化变量、过滤非数字值、指定分隔符并避免除零错误。

用 awk 计算文件某列的平均值,核心是累加该列数值并除以总行数(或有效行数),关键在于正确初始化、累加和避免除零错误。
计算单列平均值(最常用)
假设文件 data.txt 每行一个数字(或有多列,取第2列),直接用 NR 作为行数分母:
-
第二列平均值:
awk '{sum += $2} END {if (NR > 0) print sum/NR; else print "empty"}' data.txt -
第一列平均值(整行仅一个数):
awk '{sum += $1} END {print sum/NR}' data.txt
注意:NR 是总行数,只要文件非空就可用;但若某行第二列为空或非数字, 会转为 0,可能影响结果——需额外过滤。
只对有效数字求平均(带条件过滤)
当列中含空值、文本或非数字时,应先判断是否为合法数字:
-
确保第1列是浮点数再累加:
awk '$1 ~ /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?$/ {sum += $1; n++} END {if (n > 0) print sum/n; else print "no valid number"}' file -
更简洁的数字判断(适用于多数场景):
awk '$1 != "" && $1 == $1 + 0 {sum += $1; n++} END {if (n) print sum/n}' file
(原理:利用$1 == $1 + 0在 awk 中仅对纯数字为真)
指定分隔符时计算(如 CSV 或冒号文件)
若数据用逗号、冒号等分隔,必须用 -F 明确指定:
-
CSV 文件第3列平均值:
awk -F',' '{sum += $3; n++} END {print sum/n}' data.csv -
/etc/passwd 中 shell 字段长度平均值(第7列):
awk -F: '{len = length($7); sum += len; n++} END {print sum/n}' /etc/passwd
避免常见错误
实际使用中容易忽略三点:
-
未初始化变量:awk 中未赋初值的变量默认为 0 或空字符串,但显式写
BEGIN{sum=0;n=0}更清晰安全; -
空文件导致除零:
END块中务必检查n > 0或NR > 0; -
字段不存在时报错静默:访问
$10而某行只有 3 列时,awk 返回空字符串(参与运算转为 0),不会报错,但结果可能偏离预期。











