簡體   English   中英

使用awk計算並打印每行的平均分數

[英]Using awk to calculate and print average scores for each row

使用awk命令

  1. 使用grades.txt文件打印出每個學生的名字和姓氏,並計算/打印他們當前所擁有的分數(假設每個分配的權重相等)。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM