我正在尝试编写一个读取文件'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
我理解回声只会打印出此时的平均值,但我试图在我尝试其他部分之前至少得到它来计算平均值。宝贝步骤!
答案 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