免费注册 查看新帖 |

Chinaunix

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

求助perl大神 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-31 17:24 |只看该作者 |倒序浏览
如果我想处理下面的文本,已知第二第三列为其起始终止坐标,当他们第五列相同时比较他们的第二第三列,如果坐标区间有重叠,则合并之并取其最小的起始坐标和最大的终止坐标,将没有重叠的删去。

处理数据:
refseq1 8  13  +       NM_152486       SAMD11
refseq1 6  11  +       NM_152486       SAMD11
refseq1 14  16  +       NM_152486       SAMD11
refseq1 6  12  -       NM_021170       HES4
refseq1 8  10  -       NM_021170       HES4
refseq2 9  11  -       NM_001002919    FAM150B
refseq2 3  8  -       NM_001002919    FAM150B
期望结果是
refseq1 6  13  +       NM_152486_E1       SAMD11
refseq1 6  12  -       NM_021170_E1       HES4

论坛徽章:
0
2 [报告]
发表于 2014-09-02 16:21 |只看该作者
本帖最后由 frankhyk 于 2014-09-02 16:23 编辑

唉,好久没写了,憋了半天才弄出个结果,不知道满不满足你的要求。

  1. use List::Util qw(max min);
  2. open(FH,"file_name");
  3. while(<FH>){
  4.         {
  5.         @data_a=split(/\s+/,$_);
  6.         push(@{$hash_1{$data_a[4]}},$_);
  7.         }
  8. }
  9. foreach $a_key (sort keys %hash_1)
  10. {
  11.         undef @num1;
  12.         undef @num2;
  13.         for ($k=0;$k<@{$hash_1{$a_key}};$k=$k+1)
  14.         {
  15.         @data_b=split(/\s+/,$hash_1{$a_key}[$k]);
  16.         push(@num1,$data_b[1]);
  17.         push(@num2,$data_b[2]);
  18.         }
  19.         $data_b[1]=min(@num1);
  20.         $data_b[2]=max(@num2);
  21.         $hash_1{$a_key}=join("  ",@data_b);
  22. }
  23. foreach $a_key (sort keys %hash_1)
  24. {
  25.         print "$hash_1{$a_key}\n";
  26. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2014-09-02 16:56 |只看该作者
谢谢了啊,我先跑一跑试试

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

  35. }

  36. __DATA__
  37. refseq1 8  13  +       NM_152486       SAMD11
  38. refseq1 6  11  +       NM_152486       SAMD11
  39. refseq1 14  16  +       NM_152486       SAMD11
  40. refseq1 6  12  -       NM_021170       HES4
  41. refseq1 8  10  -       NM_021170       HES4
  42. refseq2 9  11  -       NM_001002919    FAM150B
  43. refseq2 3  8  -       NM_001002919    FAM150B
复制代码
回复 1# 语笑嫣然qaz
貌似没加E1....


   

论坛徽章:
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-11-01 18:55 |只看该作者
  1. #!/usr/bin/perl -w
  2. my %hash;
  3. my %hash2;
  4. my @a;
  5. while(<DATA>)
  6. {
  7.     my @a=split;
  8.     push @{$hash{$a[4]}},@a[1,2];   
  9.     @{$hash2{$a[4]}}=@a[0,3,5];

  10. }

  11. foreach my $tem(sort keys %hash)
  12. {
  13.       my @b=sort({$a<=>$b} @{$hash{$tem}});
  14.       my @c=@{$hash2{$tem}};
  15.       printf "$c[0]\t$b[0]\t$b[-1]\t$c[1]\t$tem\t$c[2]\n";

  16. }

  17. __DATA__
  18. refseq1 8  13  +       NM_152486       SAMD11
  19. refseq1 6  11  +       NM_152486       SAMD11
  20. refseq1 14  16  +       NM_152486       SAMD11
  21. refseq1 6  12  -       NM_021170       HES4
  22. refseq1 8  10  -       NM_021170       HES4
  23. refseq2 9  11  -       NM_001002919    FAM150B
  24. refseq2 3  8  -       NM_001002919    FAM150B
复制代码
  1. # ./1.pl
  2. refseq2        3        11        -        NM_001002919        FAM150B
  3. refseq1        6        12        -        NM_021170        HES4
  4. refseq1        6        16        +        NM_152486        SAMD11
复制代码

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
6 [报告]
发表于 2014-11-01 19:43 |只看该作者
把E1,E2...也加上了~方法有些笨~
  1. #!/usr/bin/perl
  2. use strict;
  3. my $ref = {};
  4. while (<DATA>)
  5. {
  6. chomp;
  7. my ($name,$s,$e,$p,$inf1,$inf2) = split /\s+/,$_;
  8. push @{$ref->{$name}->{$p}->{$inf1}->{$inf2}},[$s,$e];
  9. }
  10. foreach my $name (sort keys %$ref) {
  11.    foreach my $p (sort keys %{$ref->{$name}}) {
  12.         foreach my $inf1 (sort keys %{$ref->{$name}->{$p}}) {
  13.            foreach my $inf2 (sort keys %{$ref->{$name}->{$p}->{$inf1}}) {
  14.                  my @all = @{$ref->{$name}->{$p}->{$inf1}->{$inf2}};
  15.                         my @sort = sort {$a->[0] <=> $b->[0]}@all;
  16.                  my $start = $sort[0][0];
  17.                  my $end = $sort[0][1];
  18.                  my $n = 0;
  19.                  my $m = 1;
  20.                   for my $i (1..$#sort) {
  21.                            if ($end >= $sort[$i][0] && $end <= $sort[$i][1]){
  22.                                $end =  $sort[$i][1];
  23.                                $n++;
  24.                             }
  25.                            if ($end >= $sort[$i][1])
  26.                            {$n++;}
  27.                            if ( $end <= $sort[$i][0]){
  28.                             print "$name"."\t"."$start"."\t"."$end"."\t"."$p"."\t"."$inf1"."_"."E"."$m"."\t"."$inf2"."\n" if ($n != 0);
  29.                             $m++;
  30.                            $start =  $sort[$i][0];
  31.                            $end =  $sort[$i][1];
  32.                            $n = 0;
  33.                           }
  34.                 }
  35.              print "$name"."\t"."$start"."\t"."$end"."\t"."$p"."\t"."$inf1"."_"."E"."$m"."\t"."$inf2"."\n" if $n != 0;
  36.     }
  37.   }
  38. }
  39. }

  40. __DATA__
  41. refseq1 8  13  +       NM_152486       SAMD11
  42. refseq1 6  11  +       NM_152486       SAMD11
  43. refseq1 14  16  +       NM_152486       SAMD11
  44. refseq1 6  12  -       NM_021170       HES4
  45. refseq1 8  10  -       NM_021170       HES4
  46. refseq2 9  11  -       NM_001002919    FAM150B
  47. refseq2 3  8  -       NM_001002919    FAM150B
复制代码
回复 1# 语笑嫣然qaz


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
7 [报告]
发表于 2014-11-01 19:44 |只看该作者
  1. refseq1        6        13        +        NM_152486_E1        SAMD11
  2. refseq1        6        12        -        NM_021170_E1        HES4
复制代码

论坛徽章:
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
8 [报告]
发表于 2014-11-01 21:46 |只看该作者
回复 7# 清泉一边

这答案不对吧,应该返回三行的吧,我看他是说第五列,应该是三行啊


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
9 [报告]
发表于 2014-11-01 21:55 |只看该作者
是两行呀,他期望的结果就是我输出的结果呢~他要求删去那些没有交集的
回复 8# wiliiwin


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
10 [报告]
发表于 2014-11-01 22:09 |只看该作者
我认为他的数据,第五列相同,第一列和第六列也是相同的~所以没纠结于他说的第五列~
回复 8# wiliiwin


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP