免费注册 查看新帖 |

Chinaunix

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

急急急!提取最长序列 [复制链接]

论坛徽章:
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
11 [报告]
发表于 2015-09-28 18:08 |只看该作者
本帖最后由 sunzhiguolu 于 2015-10-02 15:45 编辑

回复 9# 赛萌
    抱歉, 在看问题的时候理解的有问题. 我将代码修改了一下, 再试试...
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;

  5. sub set_or_get_last_id{
  6.         state $last_id;
  7.         $last_id = shift if (@_);
  8.         $last_id;
  9. }

  10. my %keys;
  11. while (<>){
  12.         chomp;
  13.         my @a_line = split /\s+/;
  14.         my (undef, $id) = (@a_line);
  15.         if (m/^>/ and !(exists $keys{$id})){
  16.                 set_or_get_last_id($id);
  17.                 $keys{$id} = undef;
  18.         }else{
  19.                 my $current_str = $a_line[0];
  20.                 my $last_id = set_or_get_last_id();
  21.                 $keys{$last_id} = $current_str if (length($current_str) > length($keys{$last_id}));
  22.         }
  23. }

  24. while (my ($id, $value) = each %keys){
  25.         say "> $id\n$value";
  26. }
复制代码

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2016-03-03 17:51:32CU十四周年纪念徽章
日期:2016-03-21 18:45:39
12 [报告]
发表于 2015-09-28 18:14 |只看该作者
回复 11# sunzhiguolu

我直接把这一行($name, $id) = ($a_line[0], $a_line[1]);改成了($name, $id) = ($a_line[1], $a_line[1]);
   应该没错吧?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2015-09-28 21:09 |只看该作者
我还是觉得这个应该用 Bio::Seq 来读取。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2015-09-28 21:48 |只看该作者
本帖最后由 MMMIX 于 2015-09-28 21:48 编辑

回复 1# 赛萌


    试试这个用 Bio::SeqIO 的版本:

#!/usr/bin/perl

use strict;
use warnings;

use v5.14;
use autodie;
use Data::Dumper;

use Bio::SeqIO;

my $in  = Bio::SeqIO->new( '-format' => 'fasta', '-file' => $ARGV[0] );
my $out = Bio::SeqIO->new( '-format' => 'fasta', '-fh'   => \*STDOUT );

my %longest;

while (my $seq = $in->next_seq()) {
  my $id = $seq->id();
  $id =~ s/\.[^.]+$//;
  if (not exists $longest{$id} or $seq->length() > $longest{$id}->length()) {
    $longest{$id} = $seq;
  }
}

for my $seq (values %longest) {
  $out->write_seq($seq);
}

论坛徽章:
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
15 [报告]
发表于 2015-09-28 22:49 |只看该作者
本帖最后由 sunzhiguolu 于 2015-09-28 22:57 编辑

回复 14# MMMIX
    向您请教一个问题,
use Bio::SeqIO;
如何去学习模块的知识? 我再具体的问一下怎样才能知道我在执行哪些操作的时候去学习哪些相应的模块? 看到您每次使用一些新的技术的时候总是感觉很新奇, 但是只能停留在欣赏的状态, 想学习根本无从下手的感觉, 可能现在的我即使您向我说明也可能不太明白, 您能否指点一下...
   

   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
16 [报告]
发表于 2015-09-28 22:59 |只看该作者
本帖最后由 MMMIX 于 2015-09-28 23:00 编辑

回复 15# sunzhiguolu


    这还真没有什么速成的方法,只能慢慢积累。你对哪方面感兴趣,就多看哪方面的(好)代码、资料,然后自然的了解的相关知识、模块就越来越多。


当然,对于具体的模块,就用 perldoc 查看其文档,例如 perldoc Bio::SeqIO。

论坛徽章:
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
17 [报告]
发表于 2015-09-28 23:03 |只看该作者
回复 16# MMMIX
    我懂了, 感谢您的帮助及支持... 多谢多谢...

   

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
18 [报告]
发表于 2015-09-29 09:55 |只看该作者
本帖最后由 b114213903 于 2015-09-29 09:55 编辑

回复 14# MMMIX


    if判断很好,哈哈,学习了!


有一个问题是这样输出的序列名还是原名,与楼主要求稍有差异!

可以加上两行代码:
  1. $seq->id($id);                                #修改序列名(如: EM.1.1  => EM.1)
  2. $seq->desc('');                                #删除序列注释信息(如:EM.1 LK029911.1 +)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP