免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: newfinder
打印 上一主题 下一主题

如何进行重叠合并 [复制链接]

论坛徽章:
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
41 [报告]
发表于 2015-10-20 14:32 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-20 17:09 编辑

回复 40# xiuwosuoai
试下:
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my (%h_dat, $last_name);
  4. my $reg_distance = "(?<pre>[^:]+:)(?<n1>[0-9]+)-(?<n2>[0-9]+)";
  5. while (<>){
  6.    chomp;
  7.    my ($name, $distance) = split;
  8.    unless (exists $h_dat{$name}){
  9.       print "$last_name $h_dat{$last_name}\n" if (defined $last_name);
  10.       $h_dat{$name} = $distance;
  11.    }else{
  12.       my ($n1, $n2) = ($+{n1}, $+{n2}) if ($distance =~ m{\A$reg_distance\z});
  13.       my $_distance = $h_dat{$name};
  14.       my ($_n1, $_n2) = ($+{n1}, $+{n2}) if ($_distance =~ m{\A$reg_distance\z});
  15.       if ($n1 >= $_n1 and $n1<= $_n2){
  16.          $h_dat{$name} = $+{pre} . $_n1 . '-' . ($n2 > $_n2 ? $n2 : $_n2);
  17.          $last_name = $name;
  18.          print "$last_name $h_dat{$last_name}\n" if (eof);
  19.       }else{
  20.          print "$last_name $h_dat{$last_name}\n";
  21.          delete $h_dat{$last_name};
  22.          $h_dat{$name} = $distance;
  23.       }
  24.    }
  25. }
复制代码

  1. perl abc.pl a.txt
复制代码
不足的地方:代码不能对乱序的记录行进行处理.
如果希望进行乱序处理, 可以一次性将满足条件的行记录全部加载到哈希中, 最后再进行打印输出.

请大家给我解惑的地方, 如下:
此代码文件在处理最后一条满足条件的行记录时使用了 eof 函数, 我感觉比较生硬.
如何进行修改程序逻辑, 使得代码判断逻辑更加自然, 顺畅还请大家给予指点.
在此先谢谢大家的帮助及支持...

论坛徽章:
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
42 [报告]
发表于 2015-10-20 15:09 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-20 23:03 编辑

我没有将我的问题开一个新帖, 希望大家谅解. 只是在解决这个问题时发现代码中存在问题特此向大家求助, 希望大家给予帮助及支持... 谢谢大家了...

论坛徽章:
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
43 [报告]
发表于 2015-10-21 10:00 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-21 12:26 编辑

回复 40# xiuwosuoai
我把代码修改了下, 再试下: (测试环境:Windows 7)

  1. #!/usr/bin/perl -w
  2. use strict;

  3. my ($reg_distance, $cache) = ("(?<pre>[^:]+:)(?<n1>[0-9]+)-(?<n2>[0-9]+)");
  4. while (<>){
  5.     s/\s*\z//;
  6.     my ($name, $distance) = split;
  7.     $cache = $name . ' ' . $distance unless $cache;
  8.     if (index ($cache, $name) >= 0){
  9.         my ($n1, $n2) = ($+{n1}, $+{n2}) if ($distance =~ m{\A$reg_distance\z});
  10.         my @a_elements = split / /, $cache;
  11.         my ($_n1, $_n2) = ($+{n1}, $+{n2}) if ($a_elements[-1] =~ m{\A$reg_distance\z});
  12.         if ($n1 >= $_n1 and $n1 <= $_n2){
  13.             $cache = $a_elements[0] . ' ' . $+{pre} . $_n1 . '-' . ($n2 > $_n2 ? $n2 : $_n2);
  14.         }else{
  15.             print "$cache\n";
  16.             $cache = $name . ' ' . $distance;
  17.         }
  18.     }else{
  19.         print "$cache\n";
  20.         $cache = $name . ' ' . $distance;
  21.     }
  22.     print "$cache\n" if (eof);
  23. }
复制代码
  1. perl abc.pl a.txt
复制代码

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

我在代码中依然使用 eof 函数判断文件结尾的方式来打印最后一条满足条件的行记录, 如果大家有什么好的方法还请大家给予帮助及支持...
在此先谢过大家了...

论坛徽章:
0
45 [报告]
发表于 2015-10-21 10:16 |只看该作者
谢谢你的回答,不过测试的时候没有打印出结果,我也不晓得是哪儿的问题。。


   

论坛徽章:
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
46 [报告]
发表于 2015-10-21 10:18 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-21 10:36 编辑

回复 45# xiuwosuoai
能否具体说下...
是我的哪个回复 (1 | 2)?

1.> 在 red hat 上使用 Perl 5.010 版, 测试应该没有问题;
2.> 是刚才我在 Windows 7 操作系统上 ActivePerl 5.20.1 版下编写的, 测试应该没有问题;

如果在使用脚本中遇到了问题, 请将问题的详细信息告诉我, 我好可以进一步帮您分析下问题出在了哪里...

   

论坛徽章:
0
47 [报告]
发表于 2015-10-21 10: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
48 [报告]
发表于 2015-10-21 10:43 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-21 12:27 编辑

回复 47# xiuwosuoai
1.> 测试环境是什么 (Linux | Windows)?
2.> 如何执行的? (perl abc.pl a.txt | ./abc.pl a.txt)
3.> 执行后的结果有什么输出么?
4.> a.txt 文件中的行标头是否去掉? (name distance)

   

论坛徽章:
0
49 [报告]
发表于 2015-10-21 11:00 |只看该作者
Linux上,perl abc.pl a.txt ,结果没有合并,去掉了。。。

论坛徽章:
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
50 [报告]
发表于 2015-10-21 11:10 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-21 12:38 编辑

请将文件的执行结果贴出来, 即使我不能为您解决这个问题相信大家也能帮助到您.
请给出多一点的信息, 总是用 (去掉了 ... | 发现得到的结果和原来一样 ...) 别人很难理解.

另外, 您要的是什么样的结果? 是希望解决这个问题吗:
大神,我想请教一个问题,如果变成了下面这样,如第二行出现了这种情况,用该方法会得到结果就成了dis1:1-4;该怎么改呢?
name1        dis1:1-5
name1        dis1:2-4
name1        dis1:7-9
name1        dis1:10-12
name1        dis1:11-14
name2        dis2:5-8
name2        dis2:6-12
name2        dis2:7-14
name2        dis2:14-15
name2        dis2:17-19
name2        dis2:20-22
name2        dis2:21-25
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP