awk數組結合+=統計題


awk增加統計列值
為增加列數或進行運行結果統計,使用符號 + =。增加的結果賦給符號左邊變量值,增加
到變量的域在符號右邊。例如將 $ 1加入變量total,表達式為toatl+=$1。列值增加很有用。許
多文件都要求統計總數,但輸出其統計結果十分繁瑣。在awk中這很簡單,請看下面的例子。
將所有學生的‘目前級別分’加在一起,方法是tot+=$6,tot即為awk瀏覽的整個文件的
域6結果總和。所有記錄讀完后,在END部分加入一些提示信息及域 6總和。不必在awk中顯
示說明打印所有記錄,每一個操作匹配時,這是缺省動作。
如果文件很大,你只想打印結果部分而不是所有記錄,在語句的外面加上圓括號()即
可。

 

[root@localhost.localdomain 三 6月 14 10:17:24 home]#cat grade.txt 
M.Tansley	05/99 48311	Green 8 40 44
Lulu 06/99 48317	green 8 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842	Brown-3 12 26 26
L.Tansley 07/99 4712 Brown-2	12 30 28

  

awk '(tot+=$6);END{print "Club student total points : " tot}' grade.txt

[root@localhost.localdomain 三 6月 14 09:48:37 home]#awk '(tot+=$6);END{print "Club student total points : " tot}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
Lulu 06/99 48317	green 8 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842	Brown-3 12 26 26
L.Tansley 07/99 4712 Brown-2	12 30 28
Club student total points : 155

  

實例1:
統計某目錄下文件大小

[root@localhost.localdomain 三 6月 14 10:12:50 src]#ls -l
drwxr-xr-x 15 root root 4096 6月 5 16:49 nagios-plugins-2.1.1
-rw-r--r-- 1 root root 2677352 6月 5 16:37 nagios-plugins-2.1.1.tar.gz
-rw-r--r-- 1 root root 405725 6月 5 16:37 nrpe-2.12.tar.gz

  

ls -l | awk '/^[^d]/ {print $9 "\t"$5} {tot+=$5} END{print "total KB:"tot}'

[root@localhost.localdomain 三 6月 14 10:12:50 src]#ls -l | awk '/^[^d]/ {print $9 "\t"$5} {tot+=$5} END{print "total KB:"tot}'
nagios-plugins-2.1.1.tar.gz 2677352
nrpe-2.12.tar.gz	405725
zabbix-release-3.2-1.el7.noarch.rpm	13392
total KB:3104661

  

 

實例2:

文件如下

61.144.83.198 594
61.144.83.198 576
61.144.83.198 573
219.137.178.228 570
219.137.178.228 565
61.144.83.198 553
61.144.83.198 550
61.144.83.198 549

  

每一行以空格為分隔符,第一列是ip,第二列為不定數值

需求,現在想要將相同ip后的不定數值相加統計出來

awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' file

  

思路:

將ip作為a[]數組的下標,將$2中的內容賦值給a[$1]即a[ip],得到數組a[ip]=value

執行語句a[ip]+=value,這樣同樣的a[ip]中的值就會與下一行的$2相加,然后得到新的值,繼續執行

直到文件末尾執行完畢

 

END模塊

用變量i讀取數組的下標,再取出數值a[i]即value值

最終得到結果

 

  思考:(有什么不同)

  awk 'a[$1]+=$2;END{for(i in a)print i,a[i]}' file

  但在END前需要添加;表示結束,不然會發生語法錯誤

  這個也能得到結果,執行后發現還是一個基礎的問題pattern跟action的問題

  若沒有{}則表示pattern,action則表示1,即省略,會print $0;

  都是一些細節問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM