2013-10-03 308 views
38

我正在嘗試使用awk來查找第二列數據的平均值。這是我當前的代碼,我的導師提供的框架:使用awk查找列的平均值

#!/bin/awk 

### This script currently prints the total number of rows processed. 
### You must edit this script to print the average of the 2nd column 
### instead of the number of rows. 

# This block of code is executed for each line in the file 
{ 
x=sum 
read name 
     awk 'BEGIN{sum+=$2}' 
     # The script should NOT print out a value for each line 
} 
# The END block is processed after the last line is read 
END { 
     # NR is a variable equal to the number of rows in the file 
     print "Average: " sum/ NR 
     # Change this to print the Average instead of just the number of rows 
} 

和我收到一個錯誤,指出:

awk: avg.awk:11:  awk 'BEGIN{sum+=$2}' $name 
awk: avg.awk:11:   ^invalid char ''' in expression 

我想我接近,但我真的不知道在哪裏從這裏出發。如我們在課堂上所看到的一切已經相當基本的代碼不應該是極其複雜的。請告訴我。

+1

我對awk沒有太多,但這是否有幫助:http://stackoverflow.com/questions/8434000/awk-calculate-average-or-zero?rq=1 –

回答

84
awk '{ sum += $2; n++ } END { if (n > 0) print sum/n; }' 

添加數字在sum$2(第二列)(變量自動初始化通過awk爲零),並增加行數(這也可以通過內置變量NR處理)。最後,如果至少讀取了一個值,則打印平均值。

awk '{ sum += $2 } END { if (NR > 0) print sum/NR }' 

如果你想使用的家當符號,你可以寫:

#!/bin/awk 

{ sum += $2 } 
END { if (NR > 0) print sum/NR } 

您也可以控制平均用printf()並以適當的格式的格式("%13.6e\n",例如)。

您也可以使用推廣代碼(此樣品中N=2)以平均第N列:

awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum/NR }' 
1
awk 's+=$2{print s/NR}' table | tail -1 

我使用tail -1打印應有的平均數的最後一行。 ..

+2

一個非常奇怪的做法的東西。它有效,但我想不出使用這種技術的好理由。 –

4

你特定的錯誤是與線11:

awk 'BEGIN{sum+=$2}' 

這是一條線,其中awk被調用,並且它的BEGIN塊被指定 - 但是你已經在awk腳本中,所以你不需要指定awk。你也想在輸入的每一行運行sum+=$2,這樣你就不是一個BEGIN塊內想要它。因此,該行應僅僅是閱讀:

sum+=$2 

你也不必行:

x=sum 
read name 

第一隻創建一個同義詞sum命名x,我不知道第二做什麼,但都不需要。

這將使您的awk腳本:

#!/bin/awk 

### This script currently prints the total number of rows processed. 
### You must edit this script to print the average of the 2nd column 
### instead of the number of rows. 

# This block of code is executed for each line in the file 
{ 
    sum+=$2 
    # The script should NOT print out a value for each line 
} 
# The END block is processed after the last line is read 
END { 
    # NR is a variable equal to the number of rows in the file 
    print "Average: " sum/ NR 
    # Change this to print the Average instead of just the number of rows 
} 

喬納森·萊弗勒的回答給AWK一個襯墊代表相同的固定代碼,增加檢查至少有1線輸入的(這將停止除以零誤差)。如果

+0

這樣做,非常感謝!我沒有意識到,因爲在awk腳本中,沒有必要使用awk命令,菜鳥錯誤。再次感謝 –

+0

@BenZifkin如果你發現我的答案有用,你能接受答案嗎? – imp25

3

試試這個:

ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}' 

NR是AWK內置變量來計算無。的記錄

+0

歡迎使用堆棧溢出。如果您爲幾個月前的問題添加新的答案並且包含已接受的答案,那麼您的新答案需要提供一些獨特的新信息。目前尚不清楚這是否能完成這項工作。爲什麼你把'ls -l'輸入'awk'並不明顯?也不清楚你爲什麼使用':'作爲字段分隔符。問題表明它需要總結第2列,所以不清楚爲什麼總結第5列。 –

+0

如何同時打印文件名? –