看了几本关于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)。