使用awk计算并打印每行的平均分数

时间:2016-09-06 03:45:44

标签: linux unix awk

使用awk命令

  1. 使用grades.txt文件打印出每个学生的名字和姓氏 计算/打印他们目前拥有的等级百分比(假设相等 对于每个分配的权重)。
  2. grades.txt文件

    FN LN Lab HW1 HW2 HW3 HW4
    Ryan Slaven 1 1 0 1 1
    Jephthah Eustathios 0 1 0 1 0
    Andreas Saša 1 0 1 0 1
    Godofredo Gerard 1 1 1 1 1
    Edwin Babur 1 0 1 1 1
    Ahmad Marin 0 0 0 0 0
    Jett Marko 1 1 0 1 1
    

    我的答案是:

    awk '{sum=0;for(i=3;i<=NF;i++) sum+=$i; print $1, $2, (NF>2?sum/(NF-2):0)*100}' grades.txt
    

    但是,对于FN和LN旁边的输出,它显示0.如何删除0,或使其说“平均”?或者,我怎么能删除该行?

    此外,还有更好的方法来解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

$ awk '{print $1, $2, (NR>1 ? 100*gsub(1,1)/(NF-2) : "Average")}' file
FN LN Average
Ryan Slaven 80
Jephthah Eustathios 40
Andreas Saša 60
Godofredo Gerard 100
Edwin Babur 80
Ahmad Marin 0
Jett Marko 80

答案 1 :(得分:0)

喜欢@J Earls说,然后是一些:

$ awk 'NF>2{sum=0;for(i=3;i<=NF;i++) sum+=$i; print $1, $2, (NR>1?sum/(NF-2)*100:"Average")}' grades.txt
FN LN Average
Ryan Slaven 80
Jephthah Eustathios 40
Andreas Saša 60
Godofredo Gerard 100
Edwin Babur 80
Ahmad Marin 0
Jett Marko 80

说明:

NF>2 {                 # for records with field count more than two
    sum=0
    for(i=3;i<=NF;i++) 
        sum+=$i
    print $1, $2, (NR>1?sum/(NF-2)*100:"Average") # NR=1 print "Average", else the average
}

编辑:

如果数据的实际记录之间存在空记录,您可以删除该条件NF>2,并留下:

$ awk '{sum=0;for(i=3;i<=NF;i++) sum+=$i; print $1, $2, (NR>1?sum/(NF-2)*100:"Average")}' grades.txt

答案 2 :(得分:0)

awk 'NR == 1 { print $1, $2, "Average"; next }    # Print a heading row
     NF > 2  { sum=0; for (i=3; i<=NF; i++) sum+=$i; print $1, $2, (sum/(NF-2))*100 }' \
     grades.txt

简单地处理第一行; next跳过第一行的其余脚本。对于具有两个以上字段的其他行,请打印名称和平均值。如果需要,可以报告NF <= 2的行。

示例输出:

FN LN Average
Ryan Slaven 80
Jephthah Eustathios 40
Andreas Saša 60
Godofredo Gerard 100
Edwin Babur 80
Ahmad Marin 0
Jett Marko 80

答案 3 :(得分:-1)

仅在NF>2

的行上运行awk命令
awk 'NF>2 {…}'