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

时间:2016-06-02 10:44:33

标签: 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的文件 我想做的就是搜索课程并取得他的平均分数,提前谢谢。

1 个答案:

答案 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

命令细分: -

  1. 将字段分隔符设置为;
  2. for (i = 6; i <= NF; i++)从第6-8列循环,NF是一个特殊的awk变量,它提供了当前列的总数(字段数)
  3. s = s + $i ; print s执行常规算术,s = s + $i ; print s ? s/3 : 0.0执行平均值并以浮点表示法存储。
  4. <强>更新: -

    我担心你将如何将输入传递给awk,就像我在我的例子中所说的那样。决定自己提供解决方案。

    假设您正在向用户阅读class的值,我已按如下方式简化了整个脚本: -

    对于示例文件,如下所示: -

    $ cat file
    a;b;c;d;efg;1;2;3
    a;b;c;d;eidf;4;5;6
    

    efgeidf是上例中可能的类值。类值必须是唯一的,脚本才能工作。我的脚本将按如下方式工作: -

    # 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