免费注册 查看新帖 |

Chinaunix

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

隔行的数据处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-26 16:22 |只看该作者 |倒序浏览
有一个文件file,如下>Gene.1::NM_198493::g.1::m.1 type:5prime_partial len:287 gc:universal NM_198493:2-862(+)
LRRCYGNRGGRGPGVVFLELMESEGPPESESSEFFSQQEEENEEEEAQEPEETGPKNPLLQPALTGDVEGLQKIFEDPEN
>Gene.2::NM_198493::g.2::m.2 type:complete len:153 gc:universal NM_198493:1865-2323(+)
MYEQFSFNFLKQKNTAITFSHLFGRPSGCLWSSTKKTCVCSFFFFTLL
>Gene.3::NM_198493::g.4::m.4 type:complete len:118 gc:universal NM_198493:1954-2307(+)
MEQYKEDLCLLLFFFYPPSPFSLFPSLPLLLPLPSSPFPSLPLPSPPFLSLPLPSPPFLSPPLPSSPLPSPSSSLSSSSSLSNSFFFLSYLSLSLHPRNLLDRVCLSCPGWNAVE
>Gene.4::NM_173852::g.6::m.6 type:complete len:163 gc:universal NM_173852:27-515(+)
MRIANRTRFSSPFLARGAGWTHGRGMMVVGTGTSLALSSLLSLLLFAGMQMYSRQLASTEWLTIQGGLLGSGLFVFSLTAFNNLENLVFGKGFQAKIFPEILLCLA
>Gene.9::NM_013945::g.9::m.9 type:complete len:519 gc:universal NM_013945:599-2155(+)
MAALPGTVPRMMRPAPGQNYPRTGFPLEVSTPLGQGRVNQLGGVFINGRP
>Gene.13::NM_013945::g.13::m.13 type:complete len:102 gc:universal NM_013945:1821-2126(+)
MAAWTRPPPSQPAAASGPTPSSQETACPPPRPTAHPPTAPPATAWTPWPAISTASTARVSAWCPGRPPSPFLLPPPGPPACLWRATRWCQGGECPFHRWKN

该文件内容是每两行为一组,根据“>”后面的内容,选出相同NM编号下“len”最大的那一组,想要得到的结果如下:
>Gene.1::NM_198493::g.1::m.1 type:5prime_partial len:287 gc:universal NM_198493:2-862(+)
LRRCYGNRGGRGPGVVFLELMESEGPPESESSEFFSQQEEENEEEEAQEPEETGPKNPLLQPALTGDVEGLQKIFEDPEN
>Gene.4::NM_173852::g.6::m.6 type:complete len:163 gc:universal NM_173852:27-515(+)
MRIANRTRFSSPFLARGAGWTHGRGMMVVGTGTSLALSSLLSLLLFAGMQMYSRQLASTEWLTIQGGLLGSGLFVFSLTAFNNLENLVFGKGFQAKIFPEILLCLA
>Gene.9::NM_013945::g.9::m.9 type:complete len:519 gc:universal NM_013945:599-2155(+)
MAALPGTVPRMMRPAPGQNYPRTGFPLEVSTPLGQGRVNQLGGVFINGRP

请教大神们该怎么办呀???????谢谢啦!!!

论坛徽章:
0
2 [报告]
发表于 2016-10-26 18:23 |只看该作者


$/=undef;
$content = <DATA>;
my %hash;
while($content =~ /(Gene.+\n.+)/g) {
        #push @array, $1;
        my $content = $1;
        ($key, $length) = $content =~ /(NM_\d+).+len\d+)/;
        push @array, [$content, $key, $length];
       
        $hash{$key} //= $length;
        if($hash{$key} < $length) {
                $hash{$key} = $length;
        }
}
@target = map {$_->[0]} grep { if($hash{$_->[1]} == $_->[2]){1} else{0} } @array;
print join"\n", @target;
__DATA__
>Gene.1::NM_198493::g.1::m.1 type:5prime_partial len:287 gc:universal NM_198493:2-862(+)
LRRCYGNRGGRGPGVVFLELMESEGPPESESSEFFSQQEEENEEEEAQEPEETGPKNPLLQPALTGDVEGLQKIFEDPEN
>Gene.2::NM_198493::g.2::m.2 type:complete len:153 gc:universal NM_198493:1865-2323(+)
MYEQFSFNFLKQKNTAITFSHLFGRPSGCLWSSTKKTCVCSFFFFTLL
>Gene.3::NM_198493::g.4::m.4 type:complete len:118 gc:universal NM_198493:1954-2307(+)
MEQYKEDLCLLLFFFYPPSPFSLFPSLPLLLPLPSSPFPSLPLPSPPFLSLPLPSPPFLSPPLPSSPLPSPSSSLSSSSSLSNSFFFLSYLSLSLHPRNLLDRVCLSCPGWNAVE
>Gene.4::NM_173852::g.6::m.6 type:complete len:163 gc:universal NM_173852:27-515(+)
MRIANRTRFSSPFLARGAGWTHGRGMMVVGTGTSLALSSLLSLLLFAGMQMYSRQLASTEWLTIQGGLLGSGLFVFSLTAFNNLENLVFGKGFQAKIFPEILLCLA
>Gene.9::NM_013945::g.9::m.9 type:complete len:519 gc:universal NM_013945:599-2155(+)
MAALPGTVPRMMRPAPGQNYPRTGFPLEVSTPLGQGRVNQLGGVFINGRP
>Gene.13::NM_013945::g.13::m.13 type:complete len:102 gc:universal NM_013945:1821-2126(+)
MAAWTRPPPSQPAAASGPTPSSQETACPPPRPTAHPPTAPPATAWTPWPAISTASTARVSAWCPGRPPSPFLLPPPGPPACLWRATRWCQGGECPFHRWKN

论坛徽章:
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
3 [报告]
发表于 2016-10-26 18:44 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. local $/ = "\n>";
  5. my ($leng, $str) = 0;
  6. while (<>){
  7.     chomp;
  8.     s/\A>// if (!$leng);
  9.     if ($. % 2 and /\blen:(\d+)/){
  10.         ($leng, $str) = ($1, $_);
  11.         next;
  12.     }
  13.     if (/\blen:(\d+)/){
  14.         print $leng > $1 ? ">$str\n" : ">$_\n";
  15.     }
  16. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2016-11-13 16:27 |只看该作者
换个角度来写一个~
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;
  4. use List::Util qw(max);

  5. my (%gene_info, %id_max);
  6. my ($id, $val);
  7. while (<>) {
  8.         chomp;
  9.         if (/>.*?(NM_\d+).*?len:(\d+)/) {               
  10.                 ($id, $val) = ($1, $2);
  11.                 $gene_info{$id}{$val} = $_;
  12.                 next;
  13.         } elsif (/^[^>]+/m) {
  14.                 $id_max{$id}{$val} = $_;
  15.         }
  16. }

  17. for my $name ( keys %id_max ) {
  18.         my $max = max keys %{ $id_max{$name} };
  19.         print $gene_info{$name}{$max}, "\n";
  20.         print $id_max{$name}{$max}, "\n";       
  21. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP