免费注册 查看新帖 |

Chinaunix

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

awk 语句优化,请大家拍砖 [复制链接]

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

原始数据:

2011:11:04 00:25:00|2011:11:04 00:30:00|0801|3501|notifyDeliveryReceipt|26|27|27|0||4349
2011:11:04 00:25:00|2011:11:04 00:30:00|2001|3501|notifyDeliveryReceipt|26|30|30|0||4579
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|0701|send|26|13|13|0||1920
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|1301|send|26|5|5|0||838
2011:11:04 00:25:00|2011:11:04 00:30:00|3101|3501|notifyDeliveryReceipt|26|5|5|0||785
2011:11:04 00:25:00|2011:11:04 00:30:00|2800|3501|notifyReception|26|3|3|0||496
2011:11:04 00:25:00|2011:11:04 00:30:00|2500|3501|notifyDeliveryReceipt|26|4|4|0||608
2011:11:04 00:25:00|2011:11:04 00:30:00|1900|3501|notifyDeliveryReceipt|26|49|49|0||7682
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|2300|send|26|9|9|0||1871
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|0600|send|26|2|2|0||388
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|1200|send|26|11|11|0||303
2011:11:04 00:25:00|2011:11:04 00:30:00|1400|3501|notifyReception|26|2|2|0||284
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|2800|DeliveryConfirm|26|3|3|0||3385
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|0801|send|26|19|19|0||4978
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|2001|send|26|22|22|0||1678
2011:11:04 00:25:00|2011:11:04 00:30:00|3501|0801|DeliveryConfirm|26|15|15|0||4275

结果类似: 得出方法为:以“|”为分割,在第5个域相同的情况下第7个和第8个域 分别求和,并且第8个域的和除以第7个域的和,算百分比

DeliveryConfirm|614828|99.54%
notifyReception|1119346|99.96%
notifyDeliveryReceipt|12957885|99.98%
send|14098578|98.85%

有以下脚本可以实现:

awk -F \| '$6==26{a[$5]+=$7}{c[$5]+=$8}END{m=asort(a,b);n=asort(c,d);{for(i=0;i<=m;i++) for(s in a) if(a==b){printf "%s|%s|%0.2f%\n",s,a,c/a*100}}}'

知道写的烂,希望高手帮忙优化优化语句。
谢谢了

评分

参与人数 1可用积分 -2 收起 理由
expert1 -2 前列腺?

查看全部评分

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-11-10 10:22 |只看该作者
回复 1# lightning


没测试,
  1.    awk -F\| '$6==26{perc[$5]=100*(sum1[$5]+=$7)/(sum2[$5]+=$8)}END{for(i in perc)printf "%s|%s|%0.2f%\n", i,sum1[i],perc[i]}'
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2011-11-10 10:30 |只看该作者
[i=s] 本帖最后由 jason680 于 2011-11-10 10:36 编辑 [/i]

[b]回复 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=21626291&ptid=3617154]1#[/url] [i]lightning[/i] [/b]


去除sort就可以了....

$6==26{a[$5]+=$7}{c[$5]+=$8}
明明c[$5]的值就比a[$5]大...
结果c[s]/a[s]*100 又怎会小于 100% !!??

论坛徽章:
0
4 [报告]
发表于 2011-11-10 10:50 |只看该作者
回复  lightning


没测试,
yinyuemi 发表于 2011-11-10 10:22



    感谢,awk -F\| '$6==26{perc[$5]=100*(sum1[$5]+=$/(sum2[$5]+=$7)}END{for(i in perc)printf "%s|%s|%0.2f%\n", i,sum2,perc}'

略微修改了一下前后顺序,就完成了我的要求,谢谢了!学习了!!

论坛徽章:
0
5 [报告]
发表于 2011-11-10 12:25 |只看该作者
太给力的实例了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP