分享

awk数组结合+=统计题

 土心园 2018-07-25

awk增加统计列值
为增加列数或进行运行结果统计,使用符号 + =。增加的结果赋给符号左边变量值,增加
到变量的域在符号右边。例如将 $ 1加入变量total,表达式为toatl+=$1。列值增加很有用。许
多文件都要求统计总数,但输出其统计结果十分繁琐。在awk中这很简单,请看下面的例子。
将所有学生的‘目前级别分’加在一起,方法是tot+=$6,tot即为awk浏览的整个文件的
域6结果总和。所有记录读完后,在END部分加入一些提示信息及域 6总和。不必在awk中显
示说明打印所有记录,每一个操作匹配时,这是缺省动作。
如果文件很大,你只想打印结果部分而不是所有记录,在语句的外面加上圆括号()即
可。

 

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:
统计某目录下文件大小

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,第二列为不定数值

需求,现在想要将相同ip后的不定数值相加统计出来

1
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;

  都是一些细节问题

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多