awk增加統(tǒng)計列值 為增加列數(shù)或進(jìn)行運行結(jié)果統(tǒng)計,使用符號 + =。增加的結(jié)果賦給符號左邊變量值,增加 到變量的域在符號右邊。例如將 $ 1加入變量total,表達(dá)式為toatl+=$1。列值增加很有用。許 多文件都要求統(tǒng)計總數(shù),但輸出其統(tǒng)計結(jié)果十分繁瑣。在awk中這很簡單,請看下面的例子。 將所有學(xué)生的‘目前級別分’加在一起,方法是tot+=$6,tot即為awk瀏覽的整個文件的 域6結(jié)果總和。所有記錄讀完后,在END部分加入一些提示信息及域 6總和。不必在awk中顯 示說明打印所有記錄,每一個操作匹配時,這是缺省動作。 如果文件很大,你只想打印結(jié)果部分而不是所有記錄,在語句的外面加上圓括號()即 可。
1 2 3 4 5 6 | [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
1 2 3 4 5 6 7 | [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: 統(tǒng)計某目錄下文件大小
1 2 3 4 | [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}'
1 2 3 4 5 | [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:
文件如下
1 2 3 4 5 6 7 8 | 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,第二列為不定數(shù)值
需求,現(xiàn)在想要將相同ip后的不定數(shù)值相加統(tǒng)計出來
1 | awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' file
|
思路:
將ip作為a[]數(shù)組的下標(biāo),將$2中的內(nèi)容賦值給a[$1]即a[ip],得到數(shù)組a[ip]=value
執(zhí)行語句a[ip]+=value,這樣同樣的a[ip]中的值就會與下一行的$2相加,然后得到新的值,繼續(xù)執(zhí)行
直到文件末尾執(zhí)行完畢
END模塊
用變量i讀取數(shù)組的下標(biāo),再取出數(shù)值a[i]即value值
最終得到結(jié)果
思考:(有什么不同)
awk 'a[$1]+=$2;END{for(i in a)print i,a[i]}' file
但在END前需要添加;表示結(jié)束,不然會發(fā)生語法錯誤
這個也能得到結(jié)果,執(zhí)行后發(fā)現(xiàn)還是一個基礎(chǔ)的問題pattern跟action的問題
若沒有{}則表示pattern,action則表示1,即省略,會print $0;
都是一些細(xì)節(jié)問題
|