2017-04-19 37 views
2

我有一個包含2列數字的文本文件。查找特定行中的數字的平均值

10 2 
20 3 
30 4 
40 5 
50 6 
60 7 
70 8 
80 9 
90 10 
100 11 
110 12 
120 13 
130 14 

我想從6號線找到平均第二列的數據。即((7 + 8 + 9 + 10 + 11 + 12 + 13 + 14)/ 8 = 10.5)

我能找到這個後Scripts for computing the average of a list of numbers in a data file 並用於執行以下操作:

awk'{s+=$2}END{print "ave:",s/NR}' fileName

但是我得到了整個第二列數據的平均值。

這裏有任何提示。

+0

你嘗試過什麼?我們大多數人都很樂意幫助你改進自己的技藝,但不願意擔任短期無償編程人員。在[MCVE](http://stackoverflow.com/help/mcve)中向我們展示您的工作,您期待的結果以及您得到的結果(或錯誤),我們將幫助您弄清楚。 – ghoti

+0

我個人認爲我的例子已經足夠清楚地解釋了。我嘗試了提到的帖子中提供的代碼片段。但它在這裏給你。 awk'{s + = $ 2} END {print「ave:」,s/NR}'fileName –

+0

@SaideepPavuluri:你能創建一個15行以上的實際文件,並告訴我們你想要什麼嗎? – Inian

回答

2

這一個班輪應該做的:

awk -v s=6 'NR<s{next} {c++; t+=$2} END{printf "%.2f (%d samples)\n", t/c, c}' file 

這awk腳本有三種模式/動作對。第一個負責跳過第一個s線路。第二行在每行執行(從s開始);它會增加一個計數器並將第2列添加到運行總數中。在所有數據處理完畢後,第三次運行,並打印結果。

+0

'NR

+1

@EdMorton,這是真的,你的建議在功能上是等同的。它在gawk中似乎也稍微快一點。但是,在BSD awk中,您的解決方案速度要慢大約5%。很高興有很多方法可以解決問題。 ;-)此外,重新除以零,這是一個偉大的觀點。儘管如此,我不會將它添加到我的答案中,因爲沒有樣本的平均值未定義(或合法錯誤),而不是零。 – ghoti

0

下面的腳本應該做的工作

awk 'NR>=6{avg+=$2}END{printf "Average of field 2 starting from 6th line %.1f\n",avg/(NR-5)}' file 

輸出

Average of field 2 starting from 6th line 10.5