计算球队成绩的总分和平均分(awk)

计算球队成绩的总分和平均分(awk)

Content #

假设我们手边有一个数据文件,其中包含了两支队伍(每队两名选手)的保龄球比赛得分情况: $ cat scores.txt Rich Blum,team1,100,115,95 Barbara Blum,team1,110,115,100 Christine Bresnahan,team2,120,115,118 Tim Bresnahan,team2,125,112,116 $ 每位选手各有3场比赛的成绩,这些成绩都保存在数据文件中。每位选手由第二列的队名来标识。下面的shell脚本会计算每队总分和平均分:

$ cat bowling.sh
#!/bin/bash

for team in $(gawk -F, '{print $2}' scores.txt | uniq)
do
   gawk -v team=$team 'BEGIN{FS=","; total=0}
   {
      if ($2==team)
      {
          total += $3 + $4 + $5;
      }
   }
   END {
      avg = total / 6;
      print "Total for", team, "is", total, ",the average is",avg
   }' scores.txt
done
$

for循环中的第一条gawk语句会过滤出数据文件中的队名,然后使用uniq命令返回不重复的队名。for循环会再对每个队进行迭代。

for循环内部的gawk语句负责进行计算。对于每一条记录,该语句会先确定队名是否和正在进行循环的队名相符。这是通过gawk的-v选项实现的,该选项允许在 gawk脚本中传递shell变量。如果队名相符,只要数据记录属于同一队,代码就会对数据记录中的3场比赛得分求和,然后将每条记录的值相加。

在每个循环迭代的结尾处,gawk脚本会显示出总分和平均分。输出结果如下: $ ./bowling.sh Total for team1 is 635, the average is 105.833 Total for team2 is 706, the average is 117.667 $

From #

Linux命令行与shell脚本编程大全