2017-03-03 162 views
0

我試圖找到一個文件中包含「<總體」上的幾個數字的意思。致命:試圖找到意思時嘗試除以零?

我的代碼:

awk -v file=$file '{if ($1~"<Overall>") {rating+=$1; count++;}} {rating=rating/count; print file, rating;}}' $file | sed 's/<Overall>//' 

我越來越

awk: cmd. line:1: (FILENAME=[file] FNR=1) fatal: division by zero attempted 

每個文件。我不明白爲什麼計數將爲零如果文件不包含線,如「<總體> 5」

編輯:從(超大型)輸入文件 樣品,如要求:

<Author>RW53 
<Content>Location! Location?  view from room of nearby freeway 
<Date>Dec 26, 2008 
<No. Reader>-1 
<No. Helpful>-1 
<Overall>3 
<Value>4 
<Rooms>3 
<Location>2 
<Cleanliness>4 
<Check in/front desk>3 
<Service>-1 
<Business service>-1 

預期輸出:

[filename] X 

當X是含有<總體>

+2

你能提供你的輸入文件質疑? – Inian

+2

你的輸入'$ file'是什麼? – Inian

+3

..並明確說明您的預期輸出 – Inian

回答

4

使用的0123的平均所有行的如下,

awk -F'<Overall>' 'NF==2 {sum+=$2; count++} 
        END{printf "[%s] %s\n",FILENAME,(count?sum/count:0)}' file 

對於含有兩個<Overall>子句這樣的輸入文件時,它產生的結果如下所述文件名是input-file

<Author>RW53 
<Content>Location! Location?  view from room of nearby freeway 
<Date>Dec 26, 2008 
<No. Reader>-1 
<No. Helpful>-1 
<Overall>3 
<Value>4 
<Rooms>3 
<Location>2 
<Cleanliness>4 
<Check in/front desk>3 
<Service>-1 
<Business service>-1 
<Overall>2 

運行它產生,

[input-file] 2.5 

部分-F'<Overall>'將輸入線與解除限制器分開爲<Overall>,基本上只有線<Overall>以及後面的數字將被過濾,數字是$2這是總結和存儲在sum變量和計數跟蹤c。後的所有行的打印基本上打印使用awk特殊變量FILENAME其保持處理的文件的名稱的文件名

END子句被執行,並且平均計算當且僅當的計數不爲零。

+0

中時,我收到語法錯誤您能否解釋這是如何工作的?我對bash和awk很陌生。謝謝! – daltojam

+0

@daltojam:看看解釋是否有助於解決您的問題! – Inian

+1

完美的作品!謝謝!! – daltojam

1

您不會等到您完全閱讀文件才能計算出平均評分。如果使用模式而不是if語句,則這更簡單。您還需要刪除<Overall>之前您嘗試增加rating

awk '$1 ~ /<Overall>/ {rating+=sub("<Overall>", "", $1); count++;} 
    END {rating=rating/(count?count:1); print FILENAME, rating;}' "$file" 

(答案已更新爲固定在所述呼叫的錯字到sub和正確地避免由0除以)

+0

我有一些意外的輸出與這個答案。所有文件中的評分均超過5,但所有輸出均大於此值。我認爲即使計數!= 0,邏輯OR也會每次選擇1。但是,當我刪除「|| 1」時,每個輸出都是1.任何想法? – daltojam

+0

@daltojam sub()的第一個參數應該是「」,而不是「 linuxfan

+0

那麼,現在這個答案已被upvoted :-) – linuxfan

0
awk -F '>' ' 
    # separator of field if the > 
    # for line that containt <Overall> 
    /<Overall>/ { 
     # evaluate the sum and increment counter 
     Rate+=$2;Count++} 
    # at end of the current file 
    END{ 
     # print the average. 
     printf("[%s] %f\n", FILENAME, Rate/(Count + (! Count )) 
     } 
    ' ${File} 

# one liner 
awk -F '>' '/<Overall>/{r+=$2;c++}END{printf("[%s] %f\n",FILENAME,r/(c+(!c))}' ${File} 

注:

  • (c + (! c ))使用的副作用的邏輯NOT(!)。如果c = 0,則值爲1,否則爲0。所以,如果C = 0,則加1;如果未加0本身insurring至少1
  • 承擔全部文件的除法值反映的內容的樣本
相關問題