免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 求指导
最近访问板块 发新帖
查看: 2884 | 回复: 2
打印 上一主题 下一主题

求指导 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-18 17:27 |只看该作者 |倒序浏览
有如下格式文件,类型bed文件:
AF043090.1      0       2790    2790
AF192261.1      5       203     1054
AF192261.1      301     1028    1054
AF253472.1      0       4175    4309
AF439974.1      16      106     1409
AF439974.1      248     641     1409
AF439974.1      694     1408    1409
AF460219.1      0       2374    4098
AF460219.1      2383    2594    4098
AF460219.1      2669    2759    4098

第一列是ID;
第二列是起始位点,从0开始;
第三列是终止位点;
第四是该ID的全长;


我想利用perl程序,得到不在该文件记录的位置信息,即想得到以下结果:
AF192261.1 0-4,204-300,1029-1054
AF253472.1 4176-4309
AF439974.1 0-15,107-247,642-693
AF460219.1 2375-2382,2595-2678,2760-4098

请大家指教。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-11-19 17:53 |只看该作者
本帖最后由 huang6894 于 2014-11-19 22:06 编辑

回复 1# 那只猴子


    菜鸟写法,仅作参考:
  1. #!/usr/bin/perl -w
  2. use 5.010;
  3. my (%le,%t);
  4. while(<DATA>){
  5.                 chomp;
  6.                 my($id, $s, $e, $l) = (split);
  7.                 $le{$id} = $l;
  8.                 push @{$t{$id}},[$s, $e];
  9. }
  10. foreach my $id(keys %le){
  11.                 my @tmp = sort { $a->[0] <=> $b->[0] }@{$t{$id}};
  12.                 my @all;
  13.                 for my $r (@tmp) {
  14.                         last if $r->[1] - $r->[0] > $le{$id};
  15.                         for my $i(0..$le{$id}){
  16.                         push @all,$i unless (($r->[0] <= $i) and  ($i <= $r->[1]));
  17.                         }
  18.                 }
  19.                 my $s = join(",",@all);
  20.                 $s ||= "NA";
  21.                 1 while $s =~ s/(-)?(?<!\d)(\d+),(\d++)(?(?{$3 != $2+1})(*F))/defined $1 ?  "-$3" : "$2-$3" /e;
  22.                 say "$id\t$s";
  23. }

  24. __DATA__
  25. AF043090.1      0       2790    2790
  26. AF192261.1      5       203     1054
  27. AF192261.1      301     1028    1054
  28. AF253472.1      0       4175    4309
  29. AF439974.1      16      106     1409
  30. AF439974.1      248     641     1409
  31. AF439974.1      694     1408    1409
  32. AF460219.1      0       2374    4098
  33. AF460219.1      2383    2594    4098
  34. AF460219.1      2669    2759    4098
复制代码
----------------------------额,有bug,不改了,看三楼吧------------------------

论坛徽章:
0
3 [报告]
发表于 2014-11-19 19:04 |只看该作者
看看行不行,有个bug是会打印1409-1409

#!/usr/bin/perl
use strict;
my %hash;
my %hash1;
while(<DATA>){
                chomp;
                my ($id,$beg,$end,$last)=split /\s+/;
                $hash{$id}{$beg}=$end;
                $hash1{$id}=$last;
}
foreach my $ID(keys %hash){
                my $first=-1;
                next if($hash{$ID}{0}==$hash1{$ID}); #全部记录则不打印ID;
                print "$ID " ;
                for my $BEG(sort {$a<=>$b} keys %{$hash{$ID}}){
                                        printf "%d-%d,",$first+1,$BEG-1 unless($BEG==0);
                                        $first=$hash{$ID}{$BEG};
                                }
                        ($first < $hash1{$ID})?printf "%d-%d\n",$first+1,$hash1{$ID}:print "\n";                       
}
__DATA__
AF043090.1      0       2790    2790
AF192261.1      5       203     1054
AF192261.1      301     1028    1054
AF253472.1      0       4175    4309
AF439974.1      16      106     1409
AF439974.1      248     641     1409
AF439974.1      694     1408    1409
AF460219.1      0       2374    4098
AF460219.1      2383    2594    4098
AF460219.1      2669    2759    4098


结果是
AF253472.1 4176-4309
AF439974.1 0-15,107-247,642-693,1409-1409
AF192261.1 0-4,204-300,1029-1054
AF460219.1 2375-2382,2595-2668,2760-4098
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP