免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6319 | 回复: 11

[文本处理] 如何统计数字的分布区间? [复制链接]

论坛徽章:
0
发表于 2016-07-09 02:38 |显示全部楼层
比如,
输入:
a 1
b 21
c 13
d 24
e 15
f 16
g 27
h 9
i 31
j 65
j 35
k 55

这些数字中,小于10的出现2次,10-20出现了3次,20-40出现了5次,大于40出现了2次。
如何按这个范围统计呢?

输出:
<10 2
10-20 3
20-40 5
>40 2

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-07-09 05:29 |显示全部楼层
$>  cat aa |perl -ne '($N) = /(\d+)/; $K = int($N / 10); $K  =~ s/3/2/; $K =3 if ($K > 3); $O{$K} ++; END { @H=qw {<10 10-20 20-40 >40}; for (sort keys %O){ print "$H[$_] $O{$_}\n"}}'
<10 2
10-20 3
20-40 5
>40 2

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2016-07-09 09:22 |显示全部楼层
awk '$2<10{a+=1}$2>=10&&$2<20{b+=1}$2>=20&&$2<40{c+=1}$2>40{d+=1}END{print "<10 "a"\n10-20 "b"\n20-40 "c"\n>40 "d}'

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-07-09 10:10 |显示全部楼层
  1. sort -nrk 2 f|cut -d' ' -f2|perl -nle '{$h{q(>40)}++ if($_>40);$h{q(20-40)}++ if($_>=20&&$_<=40);$h{q(10-20)}++ if($_>=10&&$_<=20);$h{q(<10)}++ if($_<10)}END{printf("<10 %d\n10-20 %d\n20-40 %d\n>40 %d\n",@h{"<10","10-20","20-40",">40"})}'
复制代码
<10 2
10-20 3
20-40 5
>40 2

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-07-09 14:56 |显示全部楼层
本帖最后由 moperyblue 于 2016-07-09 15:07 编辑
  1. awk 'BEGIN{split("<10 10-20 20-40 >40",b)}{if($2<10)a[1]++;else if($2<20)a[2]++;else if($2<40)a[3]++;else a[4]++}END{for(i in a)print b[i],a[i]}'
复制代码

论坛徽章:
766
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-07-09 16:32 |显示全部楼层
本帖最后由 Herowinter 于 2016-07-09 16:33 编辑

回复 1# jiakon

这个分类方法20在2个区间内

  1. awk 'BEGIN{split("<10 10-20 20-40 >40",a," ")} {if($2<10)b[a[1]]++;else if($2<=20)b[a[2]]++;else if($2<=40)b[a[3]]++;else b[a[4]]++} END{for(i=1;i<=4;i++)print a[i],b[a[i]]}' urfile
  2. <10 2
  3. 10-20 3
  4. 20-40 5
  5. >40 2
复制代码

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-07-09 20:26 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
发表于 2016-07-09 22:12 |显示全部楼层
本帖最后由 jason680 于 2016-07-11 21:26 编辑

有问无回...
帖子    8
主题    6
http://bbs.chinaunix.net/thread-4234717-1-1.html
http://bbs.chinaunix.net/thread-4234716-1-1.html


$ awk 'BEGIN{t=split("10 20 40",a)}{c=0;v=$2;if(v<a[1])c=1;if(v>a[t])c=t+1;if(!c)for(n=2;n<=t;++n)if($2<=a[n]){c=n;break};d[c]++}END{print "<"a[1],d[1];for(n=2;n<=t;++n)print a[n-1]"-"a[n],d[n];print ">"a[t],d[t+1]}' file
<10 2
10-20 3
20-40 5
>40 2

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
发表于 2016-07-10 18:55 |显示全部楼层
本帖最后由 hz_oracle 于 2016-07-10 19:01 编辑

awk '$2<10{++a}$2<21{++b}$2<41{++c}END{d=NR;s1=a;s2=b-a;s3=c-b;s4=d-c;print "<10\t"s1"\n10~20\t"s2"\n20~40\t"s3"\n>40\t"s4}' file  

论坛徽章:
0
发表于 2016-07-12 06:54 |显示全部楼层
感谢各位大神!
楼上的各位的方法我试了,都可以。
hz_oracle的方法还带对齐
jason680的方法通用性更强
ll104567,moperyblue,Herowinter都比较简洁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP