如何将列名作为变量输入平均分数

  • 本文关键字:变量 平均分 bash shell
  • 更新时间 :
  • 英文 :

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

命令分解:-

  1. 将字段分隔符设置为;
  2. for (i = 6; i <= NF; i++)从第6-8列循环,NF是一个特殊的awk变量,它提供存在的列的总数(字段数)
  3. 执行普通算术的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

相关内容

  • 没有找到相关文章

最新更新