awk 處理文本平均值

3 5 6 7
2 3 1 0
4 5 6 9
2 3 4 4
2 2 1 0
4 5 0 9
假如把2列和3列的值作爲新的第5列,第5列的平均值爲avg5,求第5列中大於avg5的行數。


  1. awk 'BEGIN{while(getline<"file"){x+=$2+$3;i++};y=x/i}{if($2+$3>y)z++}END{print z}' file

[解析]

 在BEGIN模塊中利用 while(getline<"file") 來提前歷遍全文,在BEGIN中我們可以看到,我已經把$2+$3的和累加給了x變量,但是求平均值必須要知道行數,怎麼辦呢?這時候在BEGIN中NR還是0,當然可以搞定了,我們這時候就不用NR自己建個變量來保存行數就好了嘛,這樣我們可以順利的在BEGIN模塊中就已經求出了平均數了。然後按照正常的執行流程再逐行判斷第2列和第3列的和是否大於這個平均數,最後打印統計結果。


  1. awk '{x+=$2+$3;a[NR]=$2+$3}END{y=x/NR;for(i in a){if(y<a[i])z++}print z}' file

[解析]

首先來分析,第5列的值很好辦 $2+$3,但是求平均值比較麻煩,麻煩的原因是隻有最後END纔可以通過累加的x的值來除以行數然後得出平均值,又有個一個新的問題,這時候已經END了,求出了平均值但是無法再從新曆遍全文去比較每行的 $2+$3 是否大於該平均值,怎麼着?總得有個東西來裝 $2+$3 的結果吧,目的是將$2+$3的結果放入一個容器,在END求出平均值後再拿出來判斷比較,慣例請出我們的老朋友數組。最後的大家都能看懂了吧。



原文地址:http://blog.chinaunix.net/uid-10540984-id-1185098.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章