使用Bash Scripting查找读取文件的平均值

时间:2014-02-22 20:05:12

标签: linux bash file-io

我正在尝试编写一个读取文件'names.txt'的bash脚本,并计算人们成绩的平均值。例如,names.txt看起来像这样。

900706845 Harry Thompson 70 80 90
900897665 Roy Ludson 90 90 90 

脚本应该读取该行,打印出该人的ID#,三个测试分数的平均值和相应的字母等级。所以输出需要看起来像这样

900706845 80 B
900897665 90 A

继承我拥有的东西

    #!/bin/bash
    cat names.txt | while read x
    do 
         $SUM=0; for i in 'names.txt'; do SUM=$(($SUM + $i));
         done;

         echo $SUM/3
    done

我理解回声只会打印出此时的平均值,但我试图在我尝试其他部分之前至少得到它来计算平均值。宝贝步骤!

4 个答案:

答案 0 :(得分:2)

喜欢这样:

#!/bin/bash
while read a name1 name2 g1 g2 g3
do
   avg=$(echo "($g1+$g2+$g3)/3" | bc)
   echo $a $name1 $name2 $avg
done < names.txt

输出:

900706845 Harry Thompson 80
900897665 Roy Ludson 90

答案 1 :(得分:0)

ID#s和平均值可以按如下方式获得:

$ awk '{sum=0; for(i=3;i<=NF;i++) sum+=$i ; print $1, sum/3}' names.txt 
900706845 80
900897665 90

猜测如何计算成绩,可以做到:

$ awk '{sum=0; for(i=3;i<=NF;i++) sum+=$i ; ave=sum/3; print $1, ave, substr("FFFFFDCBA", ave/10, 1) }' names.txt 
900706845 80 B
900897665 90 A

上述解决方案适用于任何数量的测试,但名称限制为2个字。如果总有三个测试,但名称可以是任意数量的单词,那么使用:

$ awk '{ave=($(NF-2)+$(NF-1)+$NF)/3; print $1, ave, substr("FFFFFDCBA", ave/10, 1) }' names.txt
900706845 80 B
900897665 90 A

答案 2 :(得分:0)

根据自己的需要自定义gradeLetter

#!/bin/sh

awk '
  function gradeLetter(g)
  {
    if (g >= 90) return "A";
    if (g >= 80) return "B";
    if (g >= 70) return "C";
    if (g >= 60) return "D";
    return "E"
  }
  {
    avgGrade = ($(NF) + $(NF - 1) + $(NF - 2)) / 3;
    print $1, avgGrade, gradeLetter(avgGrade)
  }' names.txt

答案 3 :(得分:0)

使用awk one-liner:

awk '{ AVG = int( ( $(NF-2) + $(NF-1) + $(NF) ) / 3 ) ; if ( AVG >= 90 ) { GRADE = "A" } else if ( AVG >= 80 ) { GRADE = "B" } else if ( AVG >= 70 ) { GRADE = "C" } else if ( AVG >= 60 ) { GRADE = "D" } else { GRADE = "F" } ; print $1, AVG, GRADE }' file

让我们看一下细节:

awk '{

  # Calculate average
  AVG = int( ( $(NF-2) + $(NF-1) + $(NF) ) / 3 )

  # Calculate grade
  if ( AVG >= 90 ) { GRADE = "A" }
  else if ( AVG >= 80 ) { GRADE = "B" }
  else if ( AVG >= 70 ) { GRADE = "C" }
  else if ( AVG >= 60 ) { GRADE = "D" }
  else { GRADE = "F" }

  print $1, AVG, GRADE

}' file