END块在awk中用于所有输入处理完毕后执行一次汇总统计,适合计算行数、总和、平均值、最值等;需注意字段分隔符设置、数值转换、FNR/NR区别及格式化输出。

END块在awk中专用于处理完所有输入行后执行一次的汇总逻辑,适合计算总行数、总和、平均值、最大最小值等统计指标。
基本语法与触发时机
END块写在awk脚本末尾,用END { ... }包裹。它不依赖任何输入行,在读取完全部数据(包括空文件)后自动运行一次。即使输入为空,END块也会执行——这点常被用来安全输出默认统计值。
常用统计指标的实现方式
在主流程中逐行累积变量,END块中统一计算并输出:
-
行数统计:用
NF>0判断非空行,或直接用内置变量FNR(当前文件行号),最后在END中输出FNR即总行数 -
数值列求和与平均:例如对第2列求和,先
sum += $2,再在END中用sum / FNR算平均(注意除零) -
最大值/最小值追踪:初始化
max = $1(首行),后续用if ($1 > max) max = $1更新;END中输出即可 -
计数类指标:如统计含特定关键词的行数,用
/pattern/ { cnt++ },END中输出cnt
避免常见陷阱
几个关键细节影响结果准确性:
- 字段分隔符需提前设定,如
-F','或BEGIN{FS="\t"},否则$1可能不是预期列 - 数值型字段要确保可转换,含空格或非数字字符时
$2+0可强制转为数字(非法值变0) - FNR在多文件处理时是每个文件独立计数,需用
NR获取全局总行数 - 若需格式化输出(如保留两位小数),用
printf "%.2f", avg而非print
一个完整示例
统计文件中第3列的总和、均值、最大值和非空行数:
awk 'NF>0 && $3 ~ /^[0-9.]+$/ { sum += $3; count++; if (NR==1 || $3>max) max=$3 } END { if (count>0) printf "sum=%.2f, avg=%.2f, max=%.2f, count=%d
", sum, sum/count, max, count; else print "no valid data" }' file.txt











