免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2014-07-19 13:32 |只看该作者
回复 28# q1208c
不好意思啊,大侠们,这两天没上网,今天看到大家的留言,让我这个有问题就求助,不怎么独立思考的人感到非常羞愧啊。。。。

其实我的数据里有的不是乱序,有的是,但还好数据量不是很大。

多谢大家给的建议及提醒啊。。。
   

论坛徽章:
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
32 [报告]
发表于 2014-07-19 19:46 |只看该作者
回复 30# newfinder

排序不难,要是你觉得困难我可以帮你
   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
33 [报告]
发表于 2014-07-21 16:41 |只看该作者

论坛徽章:
0
34 [报告]
发表于 2014-07-21 23:57 |只看该作者
回复 32# yestreenstars

大侠,我现在再看我的数据的时候又发现了问题,数据是如下的:

Name         distance        value
name1        dis1:1-5        1
name2        dis1:2-6        2
name1        dis1:7-9        3
name1        dis1:10-12     3
name2        dis1:11-14     2
name2        dis2:5-8        4
name1        dis2:6-12       5
name2        dis2:7-14       2
name2        dis2:14-15     3
name1        dis2:17-19     4
name2        dis2:20-22     1
name2        dis2:21-25     6
……

我想合并后的结果成为如下的形式:

Name distance value
name1,name2  dis1:1-6  1,2
name1  dis1:7-9  3
name1,name2  dis1:10-14  3,2
name2,name1,name2,name2  dis2:5-15  4,5,2,3
name1  dis2:17-19  4
name2,name2  dis2:20-25  1,6

不知道该怎么写呢,请大侠赐教啊!   

论坛徽章:
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
35 [报告]
发表于 2014-07-22 10:03 |只看该作者
本帖最后由 yestreenstars 于 2014-07-22 10:03 编辑

回复 34# newfinder

没有比这更丑陋的代码了~{:2_169:}
  1. #!/usr/bin/perl
  2. my($distance, $min, $max, @name, @value);
  3. while(<DATA>){
  4.         chomp;
  5.         if($. > 1){
  6.                 my($temp1, $temp2, $temp3) = /(\S+:)(\d+)-(\d+)/;
  7.                 if($temp1 eq $distance and $temp2 <= $max){
  8.                         $max = $temp3;
  9.                         my @fields = split;
  10.                         push(@name, $fields[0]);
  11.                         push(@value, $fields[2]);
  12.                         next;
  13.                 }else{
  14.                         print join(',', @name) . " $distance$min-$max " . join(',', @value), $/;
  15.                         undef @name;
  16.                         undef @value;
  17.                 }
  18.         }
  19.         my @fields = split;
  20.         push(@name, $fields[0]);
  21.         push(@value, $fields[2]);
  22.         ($distance, $min, $max) = /(\S+:)(\d+)-(\d+)/;
  23. }
  24. print join(',', @name) . " $distance$min-$max " . join(',', @value), $/;
  25. __DATA__
  26. name1        dis1:1-5        1
  27. name2        dis1:2-6        2
  28. name1        dis1:7-9        3
  29. name1        dis1:10-12     3
  30. name2        dis1:11-14     2
  31. name2        dis2:5-8        4
  32. name1        dis2:6-12       5
  33. name2        dis2:7-14       2
  34. name2        dis2:14-15     3
  35. name1        dis2:17-19     4
  36. name2        dis2:20-22     1
  37. name2        dis2:21-25     6
复制代码

论坛徽章:
0
36 [报告]
发表于 2014-07-22 11:54 |只看该作者
回复 35# yestreenstars

大神,请接受我的膜拜!!!

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
37 [报告]
发表于 2014-08-04 21:59 |只看该作者
以前一个大神写的:
open (FILE1,"C:/Users/lenovo/Desktop/1.txt");
open (FILE2,"C:/Users/lenovo/Desktop/2.txt");
open (OUT,">C:/Users/lenovo/Desktop/3.txt");

my %hash_group;
map {
        chomp;
        my ($key,$start,$end) = split;
        push @{$hash_group{$key}},($start..$end)
}<FILE2>;
while (<FILE1>) {
        chomp;
        my ($key,$start,$end) = split;
        my %uniq;
        @uniq{@{$hash_group{$key}}}=@{$hash_group{$key}};
        my @data =sort {$a <=> $b} grep {!$uniq{$_}}($start..$end);
        my @zone;
        map {
                my $n = $_;
                $n == 0 && push @zone,$data[$n];
                $n+1<=$#data && $data[$n+1]-$data[$n]>1 && push @zone,($data[$n],$data[$n+1]);
                $n==$#data && push @zone,$data[-1];
        }0..$#data;
        for (1..($#zone+1)) {
                $_%2
                        ? print OUT "$key\t$zone[$_-1]\t"
                        : print OUT "$zone[$_-1]\n";
        }
}

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
38 [报告]
发表于 2014-09-29 11:31 |只看该作者
又写了一个~
#!/usr/bin/perl -w
use strict;
my $first = <DATA>;
print $first;
my %hash;
while (<DATA>){
chomp;
my ($k,$v) = split /\:/;
my ($start,$end) = split /-/,$v;
push @{$hash{$k}},[$start,$end];
}
foreach my $k (keys %hash){
my @sort = sort {$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1]}@{$hash{$k}};
my $f = $sort[0];
my $s = $$f[0];
my $e = $$f[1];
         for my $h (@sort){
                if ($e < $$h[0]){
                  print "$k".":"."$s"."-"."$e"."\n";
                  $s = $$h[0];
                  $e = $$h[1];
                  }
                  else {$e = $$h[1];}
         }
print "$k".":"."$s"."-"."$e"."\n";
}回复 1# newfinder


   

论坛徽章:
0
39 [报告]
发表于 2014-10-04 20:19 |只看该作者
回复 38# 清泉一边
多谢了!!受教,我也要像你这样啊

   

论坛徽章:
0
40 [报告]
发表于 2015-10-19 22:26 |只看该作者
大神,我想请教一个问题,如果变成了下面这样,如第二行出现了这种情况,用该方法会得到结果就成了dis1:1-4;该怎么改呢?
Name         distance
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