[英]Using awk to calculate and print average scores for each row
使用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,或使其說“平均”? 或者,我怎么能刪除該行?
還有,有更好的方法來解決這個問題嗎?
$ 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
就像@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
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
只在NF>2
行上運行你的awk命令:
awk 'NF>2 {…}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.