awk 中的 BEGIN 和 END 块是两个特殊的模式块,用于在处理数据之前和之后执行。
下面我们通过一个具体的例子来展示它们如何协作。假设我们有一个名为 scores.txt 的成绩单文件:
我们想计算学生的平均分,一个完整的 awk 脚本会是这样:
awk 'BEGIN {print "开始计算平均分..."; total=0; count=0} {total += $2; count++} END {printf "总分: %d, 人数: %d\n平均分: %.2f\n", total, count, total/count}' scores.txt
执行过程与输出:
开始计算平均分...总分: 255, 人数: 3平均分: 85.00
重要注意事项
执行顺序是绝对的:一定是 BEGIN -> 主处理块 (对每一行) -> END。
BEGIN 和 END 必须大写。
END 块中无法引用 $0, $1 等字段变量,因为所有数据行已经处理完毕。
你可以有多个 BEGIN 或 END 块,它们会按顺序执行。
常见用途总结
| |
|---|
BEGIN | 1. 打印报告的表头。2. 初始化变量(如总和、计数器)。3. 设置字段分隔符(FS)或输出分隔符(OFS)。 |
END | 1. 打印总结、报告尾部。2. 计算并输出平均值、总计等最终结果。3. 根据处理的所有数据给出最终结论。 |