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
的文件我所想做的就是搜索一个班级,并得出他的平均分数,提前谢谢。
您可以通过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
在您的情况下,您需要提供要为学生查找的line
,而不是file
,我猜这就是您的情况中的变量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
变量,它提供存在的列的总数(字段数)- 执行普通算术的CCD_ 10和CCD_
更新:-
我很担心您将如何将输入传递给awk
,就像我在示例中给出的那样。我决定自己提供解决方案。
假设您正在从用户那里读取class
的值,我为您简化了整个脚本,如下所示:-
对于以下示例文件:-
$ cat file
a;b;c;d;efg;1;2;3
a;b;c;d;eidf;4;5;6
CCD_ 14和CCD_。类值必须是唯一的,脚本才能工作。我的脚本工作如下:-
# 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
。