免费注册 查看新帖 |

Chinaunix

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

[其他] 【已解决】请问一下怎么统计某个范围值内的数据出现的次数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-09 19:04 |只看该作者 |倒序浏览
本帖最后由 qmqpfi 于 2012-08-27 11:20 编辑
  1. A1-A2 255
  2. A1-A2 249
  3. A2-A3 1254
  4. A3-A4 3185
  5. A4-A5 862
  6. A5-A6 5831
  7. A6-A7 220
  8. A7-A8 1848
  9. A8-A9 212
  10. A9-A11 1116
  11. A11-A13 1118
  12. A13-A14 229
  13. A14-A15 240714
  14. A1-A2 279
  15. A1-A2 271
  16. A1-A2 8352647
  17. A1-A2 263
  18. A1-A2 16087
  19. A1-A2 263
  20. A2-A3 1230
  21. A3-A4 3147
  22. A1-A2 250
  23. A2-A3 1271
  24. A3-A4 3113
  25. A4-A5 798
  26. A5-A6 5846
  27. A6-A7 190
  28. A7-A8 1673
  29. A8-A9 181
  30. A9-A11 1065
  31. A11-A13 1083
  32. A13-A14 207
  33. A14-A15 256765
复制代码
需统计的数据文件如上:
前面是区域,后面的数值是响应时间。

现在想要统计这样的数据:
每个区域在某几个范围时间出现的次数。
(范围时间间隔值可自定义,以下是500)
     0-500  500-1000  1000-1500  >1500
A1-A2   12      34      56    78
A3-A4   12      34      56    78
A5-A6   12      34      56    78
……
……

区域是不定的,A1-An....
刚学习shell不久,实在不懂怎么累计A1-A2区别的次数。
请指点一下,谢谢!

——————————
另外,我想请问一下,shell怎么定义关联下标的数组吗?

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2012-03-09 19:22 |只看该作者
  1. awk '{ r=int($2/500);b[$1];
  2.        if (r<3) a[$1 FS r]++
  3.        esle a[$1 FS 3]++
  4.      }
  5.      END{
  6.           for (j in b)
  7.             {printf j OFS;
  8.              for (i=0;i<=3;i++) printf a[j FS i]+0 OFS
  9.              printf RS ;
  10.             }
  11.          }' OFS="\t" infile  |sort -n

  12. A1-A2   7       0       0       9
  13. A11-A13 0       0       2       2
  14. A13-A14 2       0       0       2
  15. A14-A15 0       0       0       2
  16. A2-A3   0       0       3       3
  17. A3-A4   0       0       0       3
  18. A4-A5   0       2       0       2
  19. A5-A6   0       0       0       2
  20. A6-A7   2       0       0       2
  21. A7-A8   0       0       0       2
  22. A8-A9   2       0       0       2
  23. A9-A11  0       0       2       2
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-03-09 20:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2012-03-09 20:24 |只看该作者
sort 排序可以改成
  1. awk command | sort -t \- -k1.2n

  2. A1-A2   7       0       0       9
  3. A2-A3   0       0       3       3
  4. A3-A4   0       0       0       3
  5. A4-A5   0       2       0       2
  6. A5-A6   0       0       0       2
  7. A6-A7   2       0       0       2
  8. A7-A8   0       0       0       2
  9. A8-A9   2       0       0       2
  10. A9-A11  0       0       2       2
  11. A11-A13 0       0       2       2
  12. A13-A14 2       0       0       2
  13. A14-A15 0       0       0       2
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-03-10 23:12 |只看该作者
回复 4# rdcwayx


太强大了。
谢谢~~
通过这个例子,了解到了更多关于awk数组的使用,以及其它的内容。


另外,可以解释一下sort -t \- -k1.2n后面接的参数意义及用法吗?
这里实在是不明白。


再次感谢,谢谢!

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2012-03-11 15:48 |只看该作者
man sort

也可以在坛子里找,很多sort的例子了

论坛徽章:
0
7 [报告]
发表于 2012-03-11 22:04 |只看该作者
awk     'BEGIN{format="%-10s%10s%10s%10s%10s\n"; printf format,"  ","0-500","500-1000","1000-1500",">1500"}
              {if($2<500) a[1$1]++;else if($2<1000)  a[2$1]++;else if($2<1500) a[3$1]++;else a[4$1]++;b[$1]=1}
         END{for (i in b) {
               printf  format,i,a[1i],a[2i],a[3i],a[4i]         

             }
                  }'   d.txt  | sort -n -t "A" -k 2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP