看了几本关于python和shell的书后,发现不动手的话的确特别容易忘掉,故打算在新年里每天一道编程题,坚持一下看看。
Day 1 shell
编写一个awk脚本用来计算每个人的平均成绩,每次测试的平均成绩和每组队的平均成绩。如果某次成绩为负数,则表示此人错过了测试,那计算平均成绩时排除此人再计算。
输出的结果如下表,在名字的列表中,名字是10个宽度且左对齐(提示printf中使用%-10s格式),而平均值是7个字符宽度,右边两个右对齐的小数。成绩记录record1.txt如下:
Name,Team,First Test, Second Test, Third Test
Tom,Red,5,17,22
Joe,Green,3,14,22
Maria,Blue,6,18,21
Fred,Blue,2,15,23
Carlos,Red,-1,15,24
Phuong,Green,7,19,21
Enrique,Green,3,16,20
Nancy,Red,9,12,24
输出结果如下:
Name Average
---- -------
Tom 14.67
Joe 13.00
Maria 15.00
Fred 13.33
Carlos 19.50
Phuong 15.67
Enrique 13.00
Nancy 15.00
------------------
Average for Test 1 : 5
Average for Test 2 : 15.75
Average for Test 3 : 22.125
-------------------
Average for Red Team: 16
Average for Blue Team: 14.1667
Average for Green Team: 13.8889
awk代码如下:
awk -F, 'BEGIN { printf("%-10s\t%s\n","Name","Avarage") printf("%-10s\t%s\n","____","_______") } NR>1 {sum=0; i=0; for (k=3;k<=5;k++) if($k>0){ sum+=$k; i++; test[k-2]+=$k; testteam[$2]+=$k; numcount[k-2]++; teamcount[$2]++; } printf("%-10s\t%.2f\n",$1,sum/i) } END{ printf("_____________\n") for(k=1;k<=3;k++){ printf("Average for Test %d: %.2f\n",k,test[k]/numcount[k]) } printf("_____________\n") for (item in testteam){ printf("Average for %s Team: %.2f\n",item,testteam[item]/teamcount[item]) } }' record1.txt
testteam是指红黄绿这三支队伍的累积得分,test是指第一二三次考试的累积得分,numcount是指每轮考试的参加人数,teamcount是指每支队伍的参加人数。NR是指当前工作空间的记录数,NR>0指不处理第一行记录标头。注意awk中if和for均需要用{}将后面的内容括起,这样换行不会出问题。awk中的变量也有类似python的字典值,注意此时for循环中拿出元素需要小括号:for (i in testteam)。