2015-04-17 42 views
1

*這是一個重複的問題:calculate and print the average value of strings in a column猛砸列依賴平均

我有兩列的文件:

9  152 
391  576 
391  104 
391  335 
391  129 
391  280 
394  184 
394  64 
394  313 
394  159 
394  335 
394  159 
394  66 
394  435 
394  145 
450  318 
450  131 
450  131 

(實際是幾千行)

而且我m試圖爲左邊每個數字產生一個平均值,我正在尋找的輸出將是(保持到小數點後一位):

9  152 
391 284.8 
394 206.6 

我到目前爲止知道解決方案是一個awk命令,也許還使用uniq,就我所知。

另一個文件需要是相同的:

2014-05-10 23:50  335 
2014-05-10 23:50  134 
2014-05-10 23:50  134 
2014-05-10 23:50  610 
2014-05-10 23:50  131 
2014-05-10 23:50  315 
2014-05-10 23:50  131 
2014-05-10 23:50  1055 
2014-05-10 23:50  315 

回答

0

無陣列假定所有的數字awk中的方式進行分組

awk 'x~/./&&x!=$1{printf "%d\t%.1f\n",x,y/z;y=z=""} 
     {x=$1;z++;y+=$2}END{printf "%d\t%.1f\n",x,y/z}' file 

9  152.0 
391  284.8 
394  206.7 
450  193.3 
+0

謝謝,這個完美的作品,但是當我試圖使用它的另一個文件它不工作,我在哪裏可以改變它,這樣它的工作原理上的其他文件,例如: 2014年5月10日23:50 131 2014 -05-10 23:50 1055 2014-05-10 23:50 315 – user3770935

+0

@ user3770935我不知道,是那一行還是更多。在問題中發佈它。 – 2015-04-17 14:17:43

+0

更多,我編輯過,謝謝 – user3770935

2

像這樣將工作:

$ awk '{a[$1]+=$2;++c[$1]}END{for(i in a)printf "%d\t%.1f\n", i, a[i]/c[i]}' file 
391  284.8 
394  206.7 
9  152.0 
450  193.3 

陣列a保持在第一列中的每個號碼的單獨總和。 c保持有多少行對每個平均值有貢獻的計數。處理文件後,將打印第一列中每個數字的平均值。格式說明符%.1f打印平均值,修正爲小數點後1位。

注意,鍵陣列a的順序是不確定的,所以輸出是按照不同的順序來輸入。如有必要,很容易解決這個問題。

+0

我怎麼能圍繞該得到什麼?這些用作x和y座標,只要它仍然產生相同的數據,它無關緊要。 – user3770935

+0

答案取決於你使用的是哪個版本的awk。 GNU awk有一些[附加功能來控制數組遍歷的順序](https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html#Controlling-Array-Traversal),或者你可以自己跟蹤訂單。不過,我有點困惑於你的評論。這對你有沒有關係? –

+0

,只要平均數保持在與其相關的數字的旁邊,那麼所有數據都很好。雖然運行時: awk'{a [$ 1] + = $ 2; ++ c [$ 1]} END {for(i in a)printf「%d \ t%.1f \ n」,i,a [i]/c [i]}'time_bytes.out> avgTimeBytes.out 已殺死 它被殺死,或佔用所有資源並鎖定我。這是awk命令的問題,該文件相當大,但其他awk操作在過去工作過,從來沒有殺過。 – user3770935