免费注册 查看新帖 |

Chinaunix

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

[文本处理] 数字匹配求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-17 20:55 |只看该作者 |倒序浏览
有如下记录的时间文本,200表示http状态,后面数值响应时间:
200 1.707
200 1.730
200 0.092
200 0.090
200 0.004
200 0.011
200 0.207
200 0.011
200 0.004
200 0.004

现在需要时间分为以下多个等级划分:
  >=20s  
16s-19s
10s-15s
  5s-10s
  3s-4s  
  1s-2s  
0.5s-0.9s
0.1s-0.4s
  <=0.09

如将快速的通过统计出每一个范围内各含有多少个?

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
2 [报告]
发表于 2012-09-17 21:08 |只看该作者
awk '/200/{if($NF<=0.09) {idx=0} if {}...a[idx]++}END{for(i in a)print i,a[i]}' file   类似这样~~~

论坛徽章:
0
3 [报告]
发表于 2012-09-17 21:12 |只看该作者
高手,可否帮忙下写完整呢,对awk的高级使用实在没有用过。
非常感谢,在加班中!提供下支持吧! 回复 2# lkk_super


   

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
4 [报告]
发表于 2012-09-17 21:21 |只看该作者
  1. awk '/200/{if($NF<=0.09) {idx=0} if($NF>=0.1&&$NF<=0.4){idx=1}if($NF>=0.5&&$NF<=0.9){idx=2}if($NF>=1&&$NF<=2){idx=3}if($NF>=3&&$NF<=4){idx=4}if($NF>=5&&$NF<=10){idx=5}if($NF>10&&$NF<=15) {idx=6}if($NF>=16&&$NF<=19) {idx=7}if($NF>=20) {idx=8}a[idx]++}END{for(i in a)print i,a[i]}' file   
复制代码
回复 3# spidersea


   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2012-09-17 23:33 |只看该作者
  1. awk '
  2. BEGIN {
  3.         a[1] = 0
  4.         a[2] = 0.1
  5.         a[3] = 0.5
  6.         a[4] = 1
  7.         a[5] = 3
  8.         a[6] = 5
  9.         a[7] = 10
  10.         a[8] = 16
  11.         a[9] = 20
  12.         a[10] = 99999
  13. }
  14. {
  15.         for(i = 1; i <= 9; i ++)
  16.         {
  17.                 if($2 >= a[i] && $2 < a[i + 1])
  18.                 {
  19.                         b[i] ++
  20.                         break
  21.                 }
  22.         }
  23. }
  24. END {
  25.         for(i = 1; i <= 9; i ++)
  26.         {
  27.                 printf "%ss-%ss\t%d\n", a[i], a[i + 1], b[i]
  28.         }
  29. }' urfile
复制代码
区间略做调整,左闭右开。
因为你提供的区间有点小问题,比如 0.092 就不属于任何一个区间。

论坛徽章:
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
6 [报告]
发表于 2012-09-18 11:11 |只看该作者
本帖最后由 jason680 于 2012-09-18 11:25 编辑

回复 1# spidersea

How about this

s for time string
t for time array
T for total/lastest index of time array
c for count of time range

n for temporary count
  1. $ echo '200 19.707
  2. 200 1.730
  3. 200 15.092
  4. 200 0.090
  5. 200 0.004
  6. 200 0.011
  7. 200 0.207
  8. 200 20.011
  9. 200 0.004
  10. 200 0.004' | awk -vs="0.1,0.5,1,3,5,10,16,20" 'BEGIN{T=split(s,t,",")}/^200/{for(n=0;n++<T;)if($2<t[n]){c[n-1]++;next}c[n-1]++}END{for(n=0;n<=T;n++){if(!c[n])c[n]=0;printf "(%3s,%3s]\t%3d\n",t[n],t[n+1],c[n]}}'
  11. (   ,0.1]          5
  12. (0.1,0.5]          1
  13. (0.5,  1]          0
  14. (  1,  3]          1
  15. (  3,  5]          0
  16. (  5, 10]          0
  17. ( 10, 16]          1
  18. ( 16, 20]          1
  19. ( 20,   ]          1
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP