Chinaunix

标题: awk 语句优化,请大家拍砖 [打印本页]

作者: lightning    时间: 2011-11-10 10:11
标题: awk 语句优化,请大家拍砖
本帖最后由 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}}}'

知道写的烂,希望高手帮忙优化优化语句。
谢谢了
作者: yinyuemi    时间: 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]}'
复制代码

作者: jason680    时间: 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% !!??
作者: lightning    时间: 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}'

略微修改了一下前后顺序,就完成了我的要求,谢谢了!学习了!!
作者: waily    时间: 2011-11-10 12:25
太给力的实例了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2