awk是一个可用来处理数据和生成报表的工具,也是一门编程语言,特别适合处理内容有规律的文件
给定一个五行的成绩单文件
Mary 2100 80 78 74
Bob 2101 78 85 64
Tom 2102 90 75 79
Mike 2103 68 81 77
Lola 2104 83 92 76
如何用awk制作生成如下格式的表格?
Line name NO. Math English Computer Total
/-----------------------------------------
1 Mary 2100 80 78 74 232
2 Bob 2101 78 85 64 227
3 Tom 2102 90 75 79 244
4 Mike 2103 68 81 77 226
5 Lola 2104 83 92 76 251
/------------------------------------------
Total: 399 411 370
Avg: 79.8 82.2 74.0
初次写稍微复杂的awk命令,就折腾了一两个小时,学的时候原以为挺简单的,不过第一次练习还是有点困难。最终写出的命令如下:
awk 'BEGIN{sum1=0;sum2=0;sum3=0;print "Line Name No. Math English Computer Total\n";print "-----------------------------"}END{print "------------------------------\n";printf "Total: %10d %5d %5d\n",sum1,sum2,sum3;printf "Avg: %10d %5d %5d\n",sum1/NR,sum2/NR,sum3/NR}{printf "%d %4s %d %4d %7d %8d %5d\n",NR,$1,$2,$3,$4,$5,$3+$4+$5; sum1+=$3; sum2+=$4; sum3+=$5}' awk_practice1.txt
做成awk脚本文件,内容为
BEGIN {
print "Line name NO. Math English Computer Total\n";
print "-----------------------------------------\n"
sum1 = 0; # 初始化求和变量
sum2 = 0;
sum3 = 0;
}
{
printf "%d %4s %d %4d %5d %5d %4d\n",NR,$1,$2,$3,$4,$5,$3+$4+$5;
sum1 += $3; # 计算各科成绩
sum2 += $4;
sum3 += $5;
}
END {
float NR; # 行号置为浮点数,这样算出来的平均数才是小数
print "------------------------------------------\n"
printf "Total: %10d %5d %5d\n",sum1,sum2,sum3;
printf "Avg: %10.1f %5.1f %5.1f\n",sum1/NR,sum2/NR,sum3/NR;
}
执行命令调用awk脚本生成表格,命令格式为
awk -f 脚本名.awk file
[root@sotneC6 awk_task]# cat awk_practice1.txt
Mary 2100 80 78 74
Bob 2101 78 85 64
Tom 2102 90 75 79
Mike 2103 68 81 77
Lola 2104 83 92 76
[root@sotneC6 awk_task]# awk -f gradeForm.awk awk_practice1.txt
Line name NO. Math English Computer Total
-----------------------------------------
1 Mary 2100 80 78 74 232
2 Bob 2101 78 85 64 227
3 Tom 2102 90 75 79 244
4 Mike 2103 68 81 77 226
5 Lola 2104 83 92 76 251
------------------------------------------
Total: 399 411 370
Avg: 79.8 82.2 74.0
搞定!