免费注册 查看新帖 |

Chinaunix

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

如何求awk 数组中的最大值? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-17 14:19 |只看该作者 |倒序浏览
本帖最后由 lightning 于 2012-04-17 14:27 编辑

我通过 awk -F \| '{b[$1 OFS $5 OFS $6]=(a[$1 OFS $5 OFS $6]+=$7)/300}END{for(i in b)print i,b}' ss.txt
得出

2012:04:08 08:30:00 sendSms 26 134.707
2012:04:08 09:00:00 notifyMessageDeliveryReceipt 29 0.86
2012:04:08 01:40:00 smsDeliveryConfirm 26 12.3967
2012:04:12 00:05:00 notifySmsDeliveryReceipt 26 41.38
2012:04:07 21:45:00 notifyMessageReception 27 0.0133333
2012:04:11 14:10:00 sendMessage 27 1.57
2012:04:12 22:50:00 notifyMessageDeliveryReceipt 27 0.156667
2012:04:12 08:20:00 notifySmsReception 26 30.21
2012:04:11 16:50:00 sendMessage 29 0.703333
2012:04:11 14:10:00 sendMessage 29 2.65667
2012:04:12 22:50:00 notifyMessageDeliveryReceipt 29 0.353333
2012:04:10 14:00:00 notifySmsDeliveryReceipt 26 239.407
2012:04:10 16:20:00 notifyMessageDeliveryReceipt 27 3.47333

其中 '2012:04:08 08:30:00' == $1  'sendSms' ==$5  26==$6 , 后面的134.707 为数值,我想算出 2012:04:08 sendSms 26 的最大值是多少,即 4月8日当天的最大值时多少,以此类推,其他的类型在其他日期的当天最大值时多少?
请问如何该如何写这个判断

补充原始文件格式

2012:04:07 12:55:00|2012:04:07 13:00:00|193501|192300|sendSms|26|147|147|0||20562
2012:04:07 12:55:00|2012:04:07 13:00:00|190501|193501|notifySmsDeliveryReceipt|26|268|268|0||53443
2012:04:07 12:55:00|2012:04:07 13:00:00|191101|193501|notifySmsDeliveryReceipt|26|162|162|0||31915
2012:04:07 12:55:00|2012:04:07 13:00:00|192800|193501|notifySmsDeliveryReceipt|26|89|89|0||17537
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|192101|sendSms|26|85|85|0||23171
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|190901|sendSms|26|76|76|0||23165
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|191101|sendSms|26|153|153|0||33495
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|190501|sendSms|26|270|270|0||41783
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|190600|sendSms|26|51|51|0||12073
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|191200|sendSms|26|222|222|0||17516
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|191001|sendSms|26|55|55|0||18461
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|193001|sendSms|26|10|10|0||2971
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|192401|sendSms|26|22|22|0||6023
2012:04:07 12:55:00|2012:04:07 13:00:00|193501|191801|sendSms|26|84|84|0||19990
2012:04:07 12:55:00|2012:04:07 13:00:00|190600|193501|notifySmsReception|26|2|2|0||413
2012:04:07 12:55:00|2012:04:07 13:00:00|191200|193501|notifySmsReception|26|56|56|0||10788

论坛徽章:
0
2 [报告]
发表于 2012-04-17 14:44 |只看该作者
  1. awk -vFS="[| ]" '/sendSms/{a[$1" "$7" "$8]=($13>a[$1" "$7" "$8])?$13:a[$1" "$7" "$8]}END{for(i in a){print i"\t"a[i]}}' data
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-04-17 17:19 |只看该作者
已经自己解决,谢谢各位了

论坛徽章:
0
4 [报告]
发表于 2012-07-10 14:50 |只看该作者
楼主怎么解决的啊,纯脚本怎么写?

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
5 [报告]
发表于 2012-07-10 15:01 |只看该作者
  1. function max(arr, m, i) {
  2.         m = arr[0];
  3.         for (i in arr) {
  4.                 if (arr[i] > m) {
  5.                         m = arr[i];
  6.                 }
  7.         }
  8.         return m;
  9. }
  10. BEGIN {
  11.         a[0] = 1;
  12.         a[1] = 10;
  13.         print max(a);
  14. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-07-10 15:44 |只看该作者
回复 3# lightning


    怎么解决的  贴上看看~~

论坛徽章:
0
7 [报告]
发表于 2013-04-24 12:12 |只看该作者
不好意思,我刚看到短信信息,解决方法如下:

awk -F '[| ]' '{if(b[$1" "$7" "$8]<(a[$1" "$2" "$7" "$8]+=$9)/300)b[$1" "$7" "$8]=(a[$1" "$7" "$8]+=$9)/300}END{for(i in b)printf "%s\t%s\n", i,b[i]}' ss.txt

论坛徽章:
0
8 [报告]
发表于 2013-04-24 12:13 |只看该作者
dahaoshanhe 发表于 2012-07-10 15:44
回复 3# lightning


awk -F \| '{if(b[$1" "$7" "$8]<(a[$1" "$2" "$7" "$8]+=$9)/300)b[$1" "$7" "$8]=(a[$1" "$7" "$8]+=$9)/300}END{for(i in b)printf "%s\t%s\n", i,b}' ss.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP