免费注册 查看新帖 |

Chinaunix

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

求助:perl合并区间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-29 15:13 |只看该作者 |倒序浏览
比如有如下数据,第一列是分类,第二列是起始位置,第三列是结束位置
01 100 200
01 700 820
01 710 800
01 850 900
01 2000 2367
02 350 546
02 1543 1789
02 1543 1790
如果第二行的起始位置与前一行的结束位置之差<300的时候,就把他们的区间并在一起

结果如下:
01 100 200
01 700 900
01 2000 2367
02 350 546
02 1543 1790

想要知道这样的脚本怎么写,自己用循环已经乱成一团了。。

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
2 [报告]
发表于 2014-10-29 16:47 |只看该作者
放弃了。居然这么和谐。

论坛徽章:
0
3 [报告]
发表于 2014-10-29 17:07 |只看该作者
菜鸟感觉很复杂,求版上大神解决看看

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2014-10-29 17:42 |只看该作者
本帖最后由 yestreenstars 于 2014-10-29 17:53 编辑

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

  4. my($type, $start_pos, $end_pos) = split /\s+/, <DATA>;
  5. while(<DATA>){
  6.         my @field = split;
  7.         $end_pos = $field[2] and next if $field[0] == $type and $field[1] - $end_pos < 300;
  8.         print "$type $start_pos $end_pos$/";
  9.         ($type, $start_pos, $end_pos) = split;
  10. }
  11. print "$type $start_pos $end_pos$/";

  12. __DATA__
  13. 01 100 200
  14. 01 700 820
  15. 01 710 800
  16. 01 850 900
  17. 01 2000 2367
  18. 02 350 546
  19. 02 1543 1789
  20. 02 1543 1790
复制代码

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
5 [报告]
发表于 2014-10-29 18:15 |只看该作者
回复 4# yestreenstars

学习了,思路很清晰


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
6 [报告]
发表于 2014-10-29 18:46 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. my %hash;
  4. while (<DATA>){
  5. chomp;
  6. my ($name,$s,$e) = split /\s+/,$_;
  7. push @{$hash{$name}},[$s,$e];
  8. }
  9. foreach my $k (keys %hash){
  10. my @sort =  sort {$a->[0] <=> $b->[0]}@{$hash{$k}};
  11. my $start = $sort[0][0];
  12. my $end = $sort[0][1];
  13. for my $i (1..$#sort){
  14.   if ($end >= $sort[$i][0] -300){
  15.       $end =  $sort[$i][1];
  16.   }
  17.   if ($end >= $sort[$i][1]){next;
  18.   }
  19.   else {
  20.   print "$k\t$start\t$end\n";
  21.   $start =  $sort[$i][0];
  22.   $end =  $sort[$i][1];
  23.   }
  24. }
  25. print "$k\t$start\t$end\n";
  26. }

  27. __DATA__
  28. 01 100 200
  29. 01 700 820
  30. 01 710 800
  31. 01 850 900
  32. 01 2000 2367
  33. 02 350 546
  34. 02 1543 1789
  35. 02 1543 1790
复制代码
回复 1# xiaotuoba001


   
walklan 该用户已被删除
7 [报告]
发表于 2014-10-30 09:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2014-10-30 10:39 |只看该作者
回复 4# yestreenstars


    很清晰,学习了!

论坛徽章:
0
9 [报告]
发表于 2014-10-30 10:40 |只看该作者
回复 6# 清泉一边


    谢谢帮助,学习了呢!:wink:

论坛徽章:
0
10 [报告]
发表于 2014-10-30 11:07 |只看该作者
回复 7# walklan


    受益匪浅,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP