使用awk命令
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,或使其说“平均”?或者,我怎么能删除该行?
此外,还有更好的方法来解决这个问题吗?
答案 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 'NF>2 {…}'