免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4443 | 回复: 11
打印 上一主题 下一主题

awk统计,数组问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 17:19 |只看该作者 |倒序浏览
求助,想实现如下统计功能。
有个log,内容类似如下:
xxxxxxxx,resp,1001,xxxxxx,56:201,xxxx
xxxxxxxx,resp,1001,xxxxxx,56:202,xxxx
xxxxxxxx,resp,1001,xxxxxx,56:203,xxxx
......
......
xxxxxxxx,resp,1002,xxxxxx,56:201,xxxx
xxxxxxxx,resp,1002,xxxxxx,56:203,xxxx
xxxxxxxx,resp,1002,xxxxxx,56:206,xxxx
......
......
xxxxxxxx,resp,1007,xxxxxx,56:-13,xxxx
xxxxxxxx,resp,1008,xxxxxx,56:9001,xxxx
xxxxxxxx,resp,1009,xxxxxx,56:209,xxxx
......
......

xxxx,resp,[返回码1],xxxxxxx,56:[返回码2],xxxx
返回码1是全数字,返回码2会包含“-”号
返回码1和返回码2不固定,需要从日志中取,有多少种取多少种

想得到的结果是:
【1001】共计 条
【1001,201】共计 条
【1001,202】共计 条
......
......
【2001】共计 条
【2001,201】共计 条
【2001,-13】共计 条

......
......
可能几千个类似日志,共计百万条数据,所以还要考虑效率!
一向对awk数组比较恐惧,无解中,求高人相助。
感激不尽!

实际的一条log,log中还有大量其他不是这样格式的行
2009/05/31 21:34:59,<H>InMsg,resp,1008,0,9990384585601,346156950,2343590548,0,999,0,0014,200,A Portal,212.230.144.69;<B>QUsrPfRp,56:0,14:12923332326,16:00140055675190,22:1,15:2,121:20615;

[ 本帖最后由 zjdick 于 2009-6-1 18:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-06-01 17:29 |只看该作者
  1. awk -F '[:,]' '{a[$3]++;b[$3"#"$6]++}END{for (i in a) {print i":"a[i];for (j in b) {split(j,M,"#");if (M[1]==i) print j":"b[j]}}}' file
复制代码


改一下输出
  1. awk -F '[:,]' '{a[$3]++;b[$3","$6]++}END{for (i in a) {print "【"i"】共计"a[i];for (j in b) {split(j,M,",");if (M[1]==i) print "【"j"】共计"b[j]}}}' file
复制代码

[ 本帖最后由 ywlscpl 于 2009-6-1 17:33 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-06-01 17:49 |只看该作者
你的xxxxx里面包含:,数字字母么?

论坛徽章:
0
4 [报告]
发表于 2009-06-01 18:03 |只看该作者
  1. time sed 's/^.*resp,\([0-9]*\).*56:\([0-9\-]*\).*$/[\1\t\2]/g' file |awk '{++S[$1];++M[$1","$2]}END{for (i in S) print i"]",S[i];for(j in M) print j,M[j]}'

  2. [1007] 16074
  3. [1008] 16074
  4. [1009] 15510
  5. [1001] 45402
  6. [1002] 51042
  7. [1002,203] 14946
  8. [1001,201] 15510
  9. [1001,202] 14946
  10. [1001,203] 14946
  11. [1002,206] 21432
  12. [1009,209] 15510
  13. [1007,-13] 16074
  14. [1008,9001] 16074
  15. [1002,201] 14664

  16. real    0m5.573s
  17. user    0m5.779s
  18. sys     0m0.027s

  19. 14万条数据
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2009-06-01 18:07 |只看该作者
awk:
  1. awk -F '[,:]' '{a[$3","$6]++}END{for(i in a) print "["i"]:"a[i]}' urfile
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-06-01 18:30 |只看该作者
把你后来添加的和前面的一起处理的。测试数据100W条。

  1. [root]# time awk -v RS="resp,|,56:" -F, 'BEGIN{getline} NR%2==0{s=$1;a[s]++} NR%2{a[s","$1]++} END{for(i in a) print "["i"] 共计 "a[i]" 条"}' b | sort | column -t
  2. [1001,201]   共计  100001  条
  3. [1001,202]   共计  100001  条
  4. [1001,203]   共计  100001  条
  5. [1001]       共计  300003  条
  6. [1002,201]   共计  100001  条
  7. [1002,203]   共计  100001  条
  8. [1002,206]   共计  100001  条
  9. [1002]       共计  300003  条
  10. [1007,-13]   共计  100001  条
  11. [1007]       共计  100001  条
  12. [1008,0]     共计  100001  条
  13. [1008,9001]  共计  100001  条
  14. [1008]       共计  200002  条
  15. [1009,209]   共计  100001  条
  16. [1009]       共计  100001  条

  17. real    0m10.996s
  18. user    0m10.947s
  19. sys     0m0.051s
复制代码

论坛徽章:
0
7 [报告]
发表于 2009-06-01 22:27 |只看该作者

回复 #6 kwokcn 的帖子

没看懂,NR%2啥意思?

论坛徽章:
0
8 [报告]
发表于 2009-06-01 22:47 |只看该作者

回复 #7 zjdick 的帖子

以"resp,"或",56:"作为换行符,半角逗号为分隔符,第一行无意义,其他的行,偶数行的第一个域是"resp,xxx"这里要获取的字符串,奇数行的第一个域是"56x"这里要获取的字符串。

论坛徽章:
0
9 [报告]
发表于 2009-06-02 08:56 |只看该作者
用perl效率如何

  1. perl -ne '
  2. /^.*?resp,(\d+).*?56:(-?\d+)/;
  3. $a{$1}++;$b{$1}{$2}++;
  4. END{
  5. foreach $key (sort keys (%a)){
  6. printf "【%s】共计 %d 条\n",$key,$a{$key};
  7. foreach $skey (sort keys (%{$b{$key}})){
  8. printf "【%s,%s】共计 %d 条\n",$key,$skey,$b{$key}{$skey};
  9. }
  10. }
  11. }' 数据文件
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-06-02 09:09 |只看该作者

  1. time perl -ne '
  2. /^.*?resp,(\d+).*?56:(-?\d+)/;                        
  3. $a{$1}++;$b{$1}{$2}++;                                
  4. END{                                                  
  5. foreach $key (sort keys (%a)){                        
  6. printf "【%s】共计 %d 条\n",$key,$a{$key};            
  7. foreach $skey (sort keys (%{$b{$key}})){              
  8. printf "【%s,%s】共计 %d 条\n",$key,$skey,$b{$key}{$skey};
  9. }                                                         
  10. }                                                         
  11. }' 5                                                      
  12. 【1001】共计 450000 条                                    
  13. 【1001,201】共计 150000 条                                
  14. 【1001,202】共计 150000 条                                
  15. 【1001,203】共计 150000 条                                
  16. 【1002】共计 450000 条                                    
  17. 【1002,201】共计 150000 条                                
  18. 【1002,203】共计 150000 条
  19. 【1002,206】共计 150000 条
  20. 【1007】共计 150000 条
  21. 【1007,-13】共计 150000 条
  22. 【1008】共计 150000 条
  23. 【1008,9001】共计 150000 条
  24. 【1009】共计 150000 条
  25. 【1009,209】共计 150000 条

  26. real    0m6.120s
  27. user    0m6.000s
  28. sys     0m0.108s

  29. wc -l 5
  30. 1350000 5

  31. 因为数据是复制的,有重复,不知道实际情况会如何
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP