免费注册 查看新帖 |

Chinaunix

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

perl区间交集问题(急!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-25 11:11 |只看该作者 |倒序浏览
第2列三列没用,那么用每一行的第5列和第6列与下面各列的进行比较,5列为起始坐标,6列为终止坐标。输出他们的最大交集(即如果坐标区间有重叠,则合并之并取其最小的起始坐标和最大的终止坐标)
a.1        1        3        b        2        8
a.2        2        5        b        5        9
a.3        3        6        b        4        7
a.4        2        4        b        12        15
c.1        3        8        d        1        7
c.2        4        8        d        6        8
理想输出
a        b=1        2        9
a        b=2        12        15
c        d        1        8
"="代表b出现的次数
另外还需要输出另一个文件,即最小交集(如果坐标区间有重叠,则合并之并取其最大的起始坐标和最小的终止坐标)
理想结果是
a        b=1        5        7
a        b=2        12        15
c        d        6        7
求大神帮忙!!!

论坛徽章:
0
2 [报告]
发表于 2013-12-25 13:38 |只看该作者
且不另你年少无知,当你得不到答案的时候多了,你才能知道其实提问是有提问的智慧的,问题最终都是自己解决,如果要别人帮你解决,请花钱。

论坛徽章:
0
3 [报告]
发表于 2013-12-25 13:40 |只看该作者
回复 2# jjboy110
一个脚本哦。。。。

   

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
4 [报告]
发表于 2013-12-25 13:40 |只看该作者
本帖最后由 xiumu2280 于 2013-12-25 13:50 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash_data;
  5. map {chomp;$_=~/([a-z]+)./;push @{$hash_data{$1}},[split,1,0,0]} <DATA>;

  6. foreach my $k (sort {$a cmp $b}keys %hash_data) {       
  7.         my @ori = shift@{$hash_data{$k}};
  8.         $ori[0][7]=$ori[0][4];
  9.         $ori[0][8]=$ori[0][5];
  10.         foreach my $line (@{$hash_data{$k}}) {
  11.                 $line->[7]=$line->[4];
  12.                 $line->[8]=$line->[5];
  13.                 if ($line->[4] <= $ori[-1][5]) {
  14.                          if ($ori[-1][5] <= $line->[5]) {
  15.                                 $ori[-1][5] = $line->[5];
  16.                                 $ori[-1][6]++;
  17.                                 if ($ori[-1][7] <= $line->[7]) {
  18.                                         $ori[-1][7] = $line->[7];
  19.                                 }
  20.                                 if ($ori[-1][8] >= $line->[8]) {
  21.                                         $ori[-1][8] = $line->[8];
  22.                                 }
  23.                         }else{
  24.                                 if ($ori[-1][7] <= $line->[7]) {
  25.                                         $ori[-1][7] = $line->[7];
  26.                                 }
  27.                                 if ($ori[-1][8] >= $line->[8]) {
  28.                                         $ori[-1][8] = $line->[8];
  29.                                 }
  30.                                 $ori[-1][6]++;
  31.                         }
  32.                 }else{
  33.                         push @ori,$line;
  34.                 }
  35.         }
  36.         foreach my $li (@ori) {
  37.                 print "$k\t$li->[3]=$li->[6]\t$li->[4]\t$li->[5]\n";
  38.         }
  39.         foreach my $li (@ori) {
  40.                 print "$k\t$li->[3]=$li->[6]\t$li->[7]\t$li->[8]\n";
  41.         }
  42. }

  43. __DATA__
  44. a.1        1        3        b        2        8
  45. a.2        2        5        b        5        9
  46. a.3        3        6        b        4        7
  47. a.4        2        4        b        12        15
  48. c.1        3        8        d        1        7
  49. c.2        4        8        d        6        8
复制代码
  1. a       b=3     2       9
  2. a       b=1     12      15
  3. a       b=3     5       7
  4. a       b=1     12      15
  5. c       d=2     1       8
  6. c       d=2     6       7
复制代码
结果和你的有些出入,不清楚你说的b出现的次数具体指什么,而且格式你需要自己调整下。

论坛徽章:
0
5 [报告]
发表于 2013-12-25 13:56 |只看该作者
太感谢了!!!回复 4# xiumu2280


   

论坛徽章:
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
6 [报告]
发表于 2013-12-25 15:12 |只看该作者
稍微长了点~
  1. #!/usr/bin/perl
  2. use 5.010;
  3. my ( %hash, %max, %min );
  4. while (<DATA>) {
  5.         @_ = split;
  6.         my ($head) = /([^.]+)/;
  7.         if ( ! $hash{$head} ) {
  8.                 $hash{$head} = $_[-3];
  9.                 $n=1;
  10.                 $max{$head}{$n} = $_[-1];
  11.                 $min{$head}{$n} = $_[-2];
  12.         } else {
  13.                 if ( $_[-2] >= $min{$head}{$n} && $_[-2] <= $max{$head}{$n} && $_[-1] > $max{$head}{$n} ) {
  14.                         $max{$head}{$n} = $_[-1];
  15.                 } elsif ( $_[-2] < $min{$head}{$n} && $_[-1] >= $min{$head}{$n} && $_[-1] <= $max{$head}{$n} ) {
  16.                         $min{$head}{$n} = $_[-2];
  17.                 } elsif ( $_[-2] >= $min{$head}{$n} && $_[-1] <= $max{$head}{$n} ) {
  18.                 } else {
  19.                         ++$n;
  20.                         $max{$head}{$n} = $_[-1];
  21.                         $min{$head}{$n} = $_[-2];
  22.                 }

  23.         }
  24. }
  25. for my $key ( sort keys %hash ) {
  26.         for ( keys %{$max{$key}} ) {
  27.                 say join "\t", $key, "$hash{$key}=$_", $min{$key}{$_}, $max{$key}{$_};
  28.         }
  29. }
  30. __DATA__
  31. a.1        1        3        b        2        8
  32. a.2        2        5        b        5        9
  33. a.3        3        6        b        4        7
  34. a.4        2        4        b        12        15
  35. c.1        3        8        d        1        7
  36. c.2        4        8        d        6        8
复制代码
  1. [root@localhost ~]# ./p
  2. a       b=1     2       9
  3. a       b=2     12      15
  4. c       d=1     1       8
  5. [root@localhost ~]#
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-12-25 15:32 |只看该作者
能改成这种形式吗?
本人菜鸟,看不太懂啊
理想输出
a        1_b        2-9_12-15
c        1_d        1        8
另外还需要输出另一个文件,即最小交集(如果坐标区间有重叠,则合并之并取其最大的起始坐标和最小的终止坐标)
理想结果是
a        1_b        5-7_12-15
c        1_d        6        7回复 6# yestreenstars


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
8 [报告]
发表于 2013-12-25 15:37 |只看该作者
{:2_172:}小伙伴们, 这个文件有没有?

a.1        1        3        b        2        8
a.2        2        5        b        5        9
a.3        3        6        b        4        7
a.4        2        4        b        12        15
a.5        3        6        c        4        7
a.6        2        4        c        10        13

c.1        3        8        d        1        7
c.2        4        8        d        6        8
c.3        4        8        e        8        18
c.4        4        8        f        9        14

论坛徽章:
0
9 [报告]
发表于 2013-12-25 15:38 |只看该作者
这是我做的一个简单模型,实际数据比这个复杂些。回复 8# pitonas


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
10 [报告]
发表于 2013-12-25 15:41 |只看该作者
小伙伴们, 有没有? {:2_171:}
回复 9# 清泉一边1


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP