awk实战案例:统计数据生成报表

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

搞定!

你可能感兴趣的:(awk,python,运维,linux,centos)