promedio(){
clear
#Declaramos unos acumuladores para poder sumar notas
a1=0
a2=0
a3=0
cat agenda.txt | cut -d";" -f5
echo -n "Introduce una clase: "
read clase
#Bucle for
for cont in `seq 1 $(tail -1 ~/agenda.txt | cut -d";" -f1)`;
do
#Suma de notas con el acumulador se mete a acumulador
nota1=`grep ^$cont ~/agenda.txt |cut -d";" -f6`
a1=$((a1+nota1))
nota2=`grep ^$cont ~/agenda.txt |cut -d";" -f7`
a2=$((a2+nota2))
nota3=`grep ^$cont ~/agenda.txt |cut -d";" -f8`
a3=$((a3+nota3))
done
#Hacemos media
suma=$((a1+a2+a3))
divisor=$((`wc -l ~/agenda.txt | cut -d" " -f1`*3))
media=$(calc $suma/$divisor)
echo "El promedio de la clase es: "$media
}
我有这个功能,我有一个结构为Code;Name;Sur;Sur2;Class;Note1;Note2;Note3
的文件
我想做的就是搜索课程并取得他的平均分数,提前谢谢。
答案 0 :(得分:1)
您可以通过awk
执行此操作,但我不确定哪些列构成了候选人的分数,假设这些列是第6,7和第8列。
awk -F";" '{ s = ""; for (i = 6; i <= NF; i++) s = s + $i ; print s ? s/3 : 0.0 }' file
$ cat file
a;b;c;d;e;1;2;3
a;b;c;d;e;4;5;6
将产生输出
2
5
在您的情况下,您需要提供要为学生查找的file
,而不是line
,我认为这是您案例中的变量cont
。
使用以下命令,您可以获得没有平均值的总和。
awk -F";" '{ s = ""; for (i = 6; i <= NF; i++) s = s + $i ; print s}' file
命令细分: -
;
for (i = 6; i <= NF; i++)
从第6-8列循环,NF
是一个特殊的awk
变量,它提供了当前列的总数(字段数)s = s + $i ; print s
执行常规算术,s = s + $i ; print s ? s/3 : 0.0
执行平均值并以浮点表示法存储。 <强>更新: - 强>
我担心你将如何将输入传递给awk
,就像我在我的例子中所说的那样。决定自己提供解决方案。
假设您正在向用户阅读class
的值,我已按如下方式简化了整个脚本: -
对于示例文件,如下所示: -
$ cat file
a;b;c;d;efg;1;2;3
a;b;c;d;eidf;4;5;6
efg
和eidf
是上例中可能的类值。类值必须是唯一的,脚本才能工作。我的脚本将按如下方式工作: -
# Am hardcoding the class for now, can be read from read command from user
class=eidf
# This is all you need to do to get the average for 'eidf'
classAvg=$(grep -w "$class" file | awk -F";" '{ s = ""; for (i = 6; i <= NF; i++) s = s + $i ; print s ? s/3 : 0.0 }')
# This is all you need to do to get the total sum for 'eidf'
classSum=$(grep -w "$class" file | awk -F";" '{ s = ""; for (i = 6; i <= NF; i++) s = s + $i ; print s}')
echo -e $classAvg $classSum
将按预期提供输出5 15
。