免费注册 查看新帖 |

Chinaunix

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

统计文本中重复数值出现次数并排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-07 11:15 |只看该作者 |倒序浏览
0.123
0.423
0.123
0.481
0.876
0.374
0.423
0.458
0
0
0.3333333
0.373
.....
.....



诸如这样的数据格式。大概30万行,需要统计去重并统计相同数值出现的重复次数,最后对数值排序输出结果。新手比较困扰,请问如何写这个逻辑呢,谢谢各位。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-08-07 12:00 |只看该作者
sort -n | uniq -c | sort -n

论坛徽章:
0
3 [报告]
发表于 2014-08-07 12:25 |只看该作者
非常感谢,但是好像不行,uniq好像只比较的是相邻行?这样做出来还有很多重复的没有计数和删除。
回复 2# q1208c


   

论坛徽章:
0
4 [报告]
发表于 2014-08-07 12:26 |只看该作者
噢好像可以,我再试试。回复 2# q1208c


   

论坛徽章:
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
5 [报告]
发表于 2014-08-07 12:38 |只看该作者
回复 1# papagogogo

How about this ...

use strict;
use warnings;

my %hCount;
while(<DATA>){
  s/\s*$//s;
  next if(m/^\s*$/);
$hCount{$_}++;
}

foreach(sort{$a <=> $b} keys %hCount){
  print "$_\t$hCount{$_}\n";
}

__DATA__
0.123
0.423
0.123
0.481
0.876
0.374
0.423
0.458
0
0
0.3333333
0.373
   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
6 [报告]
发表于 2014-08-07 13:12 |只看该作者
楼上正解~{:2_168:}

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
7 [报告]
发表于 2014-08-07 13:32 |只看该作者
回复 5# jason680

如果数据量很大, 要怎么搞呢?
   

论坛徽章:
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
8 [报告]
发表于 2014-08-07 13:42 |只看该作者
本帖最后由 jason680 于 2014-08-07 13:43 编辑

回复 7# q1208c


$ perldoc -f sort
    sort SUBNAME LIST
    sort BLOCK LIST
    sort LIST
            In list context, this sorts the LIST and returns the sorted list
            value. In scalar context, the behaviour of "sort()" is undefined.

            ...

                # same thing, but much more efficiently;
                # we'll build auxiliary indices instead
                # for speed

                my @nums = @caps = ();
                for (@old) {
                    push @nums, ( /=(\d+)/ ? $1 : undef );
                    push @caps, uc($_);
                }

                my @new = @old[ sort {
                    $nums[$b] <=> $nums[$a]
                        ||
                    $caps[$a] cmp $caps[$b]
                    } 0..$#old
                ];

                # same thing, but without any temps
                @new = map { $_->[0] }
                       sort { $b->[1] <=> $a->[1]
                           ||
                       $a->[2] cmp $b->[2]
                } map { [$_, /=(\d+)/, uc($_)] } @old;

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
9 [报告]
发表于 2014-08-07 14:39 |只看该作者
回复 8# jason680

我的意思是, 内存里无法放下这个多数据.

你发过来的说明, 我没太看明白, 不知道 内置的 sort 函数有没有可能在硬盘上建立临时文件. 但 push 操作应该不会push到硬盘上吧.
   

论坛徽章:
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
10 [报告]
发表于 2014-08-07 14:49 |只看该作者
本帖最后由 jason680 于 2014-08-07 14:57 编辑

回复 9# q1208c

>>我的意思是, 内存里无法放下这个多数据.

这是另一个问题....

属于大数据问题...

通解
1. 大数据 solution 资料库,...
个别特解
2. 特别的解决方案--只适用本问题...
例: 先分组,再排序...
所有数据范围在 0 ~ 1 (不含1)
   分10组则为1/10 = 0.1 (先拆成十个文档)
  分5组则为1/5 = 0.2 (先拆成五个文档)


1. split FILE by range of setting(1/10, 1/5, ...) and get N files
2. sort each N files
3. combine sorted N files
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP