免费注册 查看新帖 |

Chinaunix

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

求助:用Perl统计重复行次数并排序(千万级行数)的代码 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-10 00:35 |只看该作者 |倒序浏览
本帖最后由 hkldd 于 2013-01-10 00:38 编辑

     工作中需要将系统导出的数据文件sp1进行统计处理,sp1是一个大约有3千万行左右的txt文档,其中有很多数据(识别编码)是重复出现的,我们的工作就是,统计其中已完成呼叫的识别编码,如果重复就统计次数、排序后(重复次数由大至小)保存为sp2就完成了,诚请各位大侠帮忙写段perl代码。谢谢!

以下是sp1的部分txt文档样本及期望获得的。

   序号                 识别编码         call(次)      基站
00000001    11 23 55 73 89 82     1       sp0001
00000002    13 33 58 73 82 89     1       sp0001
00000003    13 33 58 73 82 89     1       sp0001
00000004    13 33 58 73 82 89     1       sp0001
00000005    15 36 68 79 85 99     1       sp0001
00000006    01 12 23 24 55 68     1       sp0001
00000007    03 05 11 23 45 89     1       sp0001
00000008    11 23 55 73 89 82     1       sp0001
00000009    15 36 68 79 85 99     1       sp0001
00000010    15 36 68 79 85 99     1       sp0001
00000011    07 10 11 17 56 89     1       sp0001
00000012    11 23 55 73 89 82     1       sp0001
00000013    15 36 68 79 85 99     1       sp0001
00000014    16 19 28 35 65 79     1       sp0001
00000015    15 36 68 79 85 99     1       sp0001
00000016    11 23 55 73 89 82     1       sp0001
00000017    16 19 28 35 65 79     1       sp0001
00000018    11 23 55 73 89 82     1       sp0001
00000019    32 55 67 68 78 79     1       sp0001
00000020    32 55 67 68 78 79     1       sp0001
00000021    22 25 27 36 49 78     1       sp0001
00000022    22 25 27 36 49 78     1       sp0001
00000023    22 25 27 36 49 78     1       sp0001
00000024    22 25 27 36 49 78     1       sp0001
  ·
  ·
  ·
  ·

期望得到的运行结果(sp2的累计次数排序式样)

          识别编码        call(次)
   11 23 55 73 89 82     5
   15 36 68 79 85 99     5
   22 25 27 36 49 78     4
   13 33 58 73 82 89     3
   16 19 28 35 65 79     2
   32 55 67 68 78 79     2
   01 12 23 24 55 68     1
   03 05 11 23 45 89     1
   07 10 11 17 56 89     1

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-01-10 01:19 |只看该作者
看以下这段可以不?
  1. #!/usr/bin/perl
  2. my %h;
  3. open my $sp1, 'sp1';
  4. open my $sp2, '>', 'sp2';

  5. my @p = ( split /\s{4,}/, <$sp1> )[ 1, 2 ];
  6. while (<$sp1>) {
  7.     my ( undef, $s, undef ) = split /\t/, $_, 3;
  8.     $h{$s}++;
  9. }
  10. print $sp2 ' ' x 6, join( "\t\t", @p ), $/;
  11. for ( sort { $h{$b} <=> $h{$a} } keys %h ) {
  12.     print $sp2 "$_\t$h{$_}$/";
  13. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-01-10 09:14 |只看该作者
先试试用ls的Perl跑跑,如果数据量过大,而机器配置又不行,建议用Linux的 sort 和 uniq -c 搞定

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
4 [报告]
发表于 2013-01-10 11:05 |只看该作者
这个好像在shell版见过,用perl我也没想出来,版主出来解答了
回复 1# hkldd


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2013-01-10 13:06 |只看该作者

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. my %hash;
  6. open FA,"sp1" or die "$!";
  7. while(<FA>){
  8.     /((?:\s\d{2}){6})(?{$hash{$1}++})/;
  9. }
  10. close FA;
  11. open FB,">sp2" or die "$!";
  12. print FB "$_\t$hash{$_}\n" for (sort{$hash{$b} <=> $hash{$a}}keys %hash);
  13. close FB;
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-01-10 14:47 |只看该作者
回复 5# mcshell

/((?:\s\d{2}){6})(?{$hash{$1}++})/;

这行能扩展开写下么?

   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
7 [报告]
发表于 2013-01-10 14:57 |只看该作者
本帖最后由 mcshell 于 2013-01-10 14:58 编辑

回复 6# dahe_1984
  1. /((?:\s\d{2}){6})/;
  2. $hash{$1}++;

复制代码
(?{code})可以计算正则中匹配到的字符串,不会影响影响正则的匹配。
  (??{code})会影响正则的匹配。
例如:
  1. '12' =~/(\d)((??{$1+1}))(?{print $2})/;
  2. output:
  3. 2
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-01-10 15:08 |只看该作者
THanks. :wink:

论坛徽章:
0
9 [报告]
发表于 2013-01-10 15:09 |只看该作者
回复 5# mcshell


    我打算做个一次登录永久保存账户密码的程序,能给点思路么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2013-01-11 01:54 |只看该作者
谢谢大家的回复!我在xp下安装ActivePerl-5.8.8后,把两位大侠的代码,分别用记事本保存为st1.pl与st2.pl后,在行命令下执行,显示没有这个文件,双击st1.pl后在目录中产生一个空sp2文件,双击st2.pl没有反应,请问是什么原因?由于第一次使用perl,在网上爬到现在也没搞定,只好又来求助各位了,望详细指点下。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP