每天一道编程题(1)

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

猜你喜欢

转载自yeluowuhen.iteye.com/blog/2272287