免费注册 查看新帖 |

Chinaunix

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

这里该如何处理啊 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-09 11:38 |只看该作者 |倒序浏览
看了篇帖子, 内容如下:
按照第二列范围压缩显示

cat file:
111 1
111 2
333 7
222 6
222 9
111 3
222 10
333 3
333 4
333 5
333 6

result:
111 1-3
222 6-6
222 9-10
333 3-7


我在处理 333 7 这里, 由于未按第二列的数值排序 我不知道该如何处理, 请大家指点, 谢谢...
代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my (%hStat);
  5. while (<>){
  6.     my ($sID, $sVal) = split;
  7.     if (!exists $hStat{$sID}){
  8.         push (@{$hStat{$sID}}, "$sID $sVal-$sVal\n");
  9.         next;
  10.     }
  11.     my $raData = $hStat{$sID};
  12.     my ($sFirst, $sLast) = (split /[- ]/, $raData->[-1])[1,2];
  13.     if ($sLast + 1 == $sVal){
  14.         $raData->[-1] = "$sID $sFirst-$sVal\n";
  15.         next;
  16.     }
  17.     push (@$raData, "$sID $sVal-$sVal\n");
  18. }
  19. print @{$hStat{$_}} for sort keys %hStat;
复制代码
输出结果:
111 1-3
222 6-6
222 9-10
333 7-7
333 3-6

论坛徽章:
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
2 [报告]
发表于 2016-05-09 11:49 |只看该作者
回复 1# sunzhiguolu


111 1   , $h{111}->{1}
111 2   , $h{111}->{2}   ,
333 7   , $h{333}->{7}
222 6   , $h{222}->{6}
...
333 6   , $h{333}->{6}

for my $rhKey( sort keys %h){
  for( sort keys %{$rhKey}){
    ...
  }
}

论坛徽章:
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
3 [报告]
发表于 2016-05-09 12:28 |只看该作者
回复 2# jason680
大神我比较笨, 还是没能看懂, 谢谢您指点...

   

论坛徽章:
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
4 [报告]
发表于 2016-05-09 14:36 |只看该作者
本帖最后由 sunzhiguolu 于 2016-05-09 15:53 编辑

占个位置,   

论坛徽章:
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
5 [报告]
发表于 2016-05-09 14:38 |只看该作者
回复 2# jason680
大神, 您的代码的里面的那个 foreach 循环啥都没有啊.

   

论坛徽章:
0
6 [报告]
发表于 2016-05-09 14:39 |只看该作者
由于未按第二列的数值排序 我不知道该如何处理,


如何处理
按第二列的数值排序

论坛徽章:
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
7 [报告]
发表于 2016-05-09 14:44 |只看该作者
本帖最后由 sunzhiguolu 于 2016-05-09 14:46 编辑

回复 6# Okelani
大神, 按照数值排序的时候. 遇到断开的数字我处理起来就手忙脚乱.
有啥好的方法没有, 就是处理已经排序的数值, 有断开的那种,
如: 1,2,3,5,7 这样的, 得到像 1-3,5-5,7-7 这样的结果. 还请您指点...

   

论坛徽章:
0
8 [报告]
发表于 2016-05-09 15:01 |只看该作者
这样的
  1. my %que;
  2. for (<DATA>) {
  3.     my ( $c1, $c2 ) = split;
  4.     push @{ $que{$c1} }, $c2;
  5. }
  6. for my $k ( sort keys %que ) {
  7.     my @v = sort { $a <=> $b } @{ $que{$k} };
  8.     my @tmp = [ ( shift @v ) x 2 ];
  9.     $_ == $tmp[-1][-1] + 1 ? $tmp[-1][1]++ : push @tmp, [ $_, $_ ] for @v;
  10.     print join( "\t", $k, join( '-', @$_ ) ), "\n" for @tmp;
  11. }

  12. __DATA__
  13. 111 1
  14. 111 2
  15. 333 7
  16. 222 6
  17. 222 9
  18. 111 3
  19. 222 10
  20. 333 3
  21. 333 4
  22. 333 5
  23. 333 6
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 非常给力, 多谢大神指点!!!

查看全部评分

论坛徽章:
0
9 [报告]
发表于 2016-05-09 15:04 |只看该作者
  1. 111        1-3
  2. 222        6-6
  3. 222        9-10
  4. 333        3-7
复制代码

论坛徽章:
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
10 [报告]
发表于 2016-05-09 16:27 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hStat;
  5. while (<DATA>){
  6.     my ($sID, $sVal) = split;
  7.     push (@{$hStat{$sID}}, $sVal);
  8.     @{$hStat{$sID}} = sort {$a <=> $b} @{$hStat{$sID}} if (@{$hStat{$sID}} > 1);
  9. }

  10. foreach my $sID (sort {$a <=> $b} keys %hStat){
  11.     my @aData = [(shift @{$hStat{$sID}}) x 2];
  12.     foreach (@{$hStat{$sID}}){
  13.         $_ == $aData[-1][-1] + 1 ? $aData[-1][1]++ : push (@aData, [$_, $_]);
  14.     }
  15.     print "$sID\t" . join ("-", @{$_}), "\n" for @aData;
  16. }
  17. __DATA__
  18. 111 1
  19. 111 2
  20. 333 7
  21. 222 6
  22. 222 9
  23. 111 3
  24. 222 10
  25. 333 3
  26. 333 4
  27. 333 5
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP