使用id文件的子集fasta文件

时间:2016-02-11 14:29:59

标签: perl file subset fasta

我一直坚持使用一些脚本!

我在2008年制作了这个剧本,现在我正在使用一些修改,我得到错误!

#!/usr/bin/perl -w

use strict;
use Data::Dumper;

sub getSequences ($) {

    my $file = $_[0];
    open (INFILE, "<$file") || die "Error1 in opening in file: $file. $!\n";

        my @lines = <INFILE>;
        my $header; my %header2seq = ();

        foreach my $line (@lines) {
            chomp $line;
            if ($line =~ /^(>.+)$/o) { 
                $header = $1; 
            }
            else {$header2seq {$header} .= $line; }
        }
#print %header2seq;
    close (INFILE);
    return (\%header2seq);
}

sub MakeSpList ($) {

    my $sp_list = $_[0]; my %sp_names = ();
    open (INFILE2, "<$sp_list") || die "Error2 in opening in file: $sp_list. $!\n";
    my @sps = <INFILE2>;
    foreach my $line (@sps) { chomp $line; $sp_names {$line} = 1; }
    close (INFILE2);
#print Dumper (%sp_names);
    return (\%sp_names);
}



 sub CompareSpList2Sequences ($$$) {
     my $ref_header2seq = $_[0] ; my $ref_sp_names = $_[1]; my $file = $_[2];
     open (OUTFILE, ">$file.subdata") || die ("Error3 in opening out file: $file.subdata. $!\n");
     foreach my $key (keys %$ref_header2seq) {
         $key =~ m/^>([A-Z]+[0-9]+[A-Z+]).+$/o;
        #print "$1\n";
         my $header_sub = $1;
         #print $header_sub, "\n";
         #print $ref_sp_names, "\n";
         if (exists $ref_sp_names -> {$header_sub}) {
             my $seq = $ref_header2seq -> {$key};
             print OUTFILE ">$key\n$seq\n";
         }
     }  
     close (OUTFILE);
     return "42";
}


my $fasta_seqs = $ARGV[0]; my $sp_list = $ARGV[1];


my $ref_header2seq = getSequences ($fasta_seqs);
my $ref_sp_names = MakeSpList ($sp_list);
CompareSpList2Sequences ($ref_header2seq , $ref_sp_names, $fasta_seqs);

exit;

我想做的是:

我有一个包含序列的fasta文件:

YAL004W YAL004W SGDID:S000002136,Chr I,140760-141407,Genome Release 64-2-1,Dubious ORF,“Dubious open reading frame;根据现有的实验和比较序列数据不可能编码功能蛋白;完全重叠验证的基因SSA1 / YAL005C” ATGGGTGTCACCAGCGGTGGCCTTAACTTCAAAGATACCGTCTTCAATGGACAACAAAGAGACATCGAAAGTACCACCACCCAAGTCGAAAATCAAGACGTGTTCTTCCTTACCCTTCTTGTCCAAACCGTAAGCAATGGCAGCGGCGGTAGGTTCGTTAATAATACGCAAGACATTCAAACCAGCAATGGTACCAGCATCCTTGGTAGCTTGTCTTTGAGAATCGTTGAA

YAL005C SSA1 SGDID:S000000004,Chr I,141431-139503,Genome Release 64-2-1,反向互补,已验证ORF,“参与蛋白质折叠和NLS定向核转运的ATP酶; HSP70家族成员;形成伴侣蛋白与Ydj1p复合;定位于细胞核,细胞质和细胞壁; 98%与paralog Ssa2p相同,但两种蛋白质之间的细微差异提供了酵母[URE3]朊病毒繁殖和液泡介导的糖异生酶降解的功能特异性; Hsp104p的朊病毒原纤维”一般ATGTCAAAAGCTGTCGGTATTGATTTAGGTACAACATACTCGTGTGTTGCTCACTTTGCTAATGATCGTGTGGACATTATTGCCAACGATCAAGGTAACAGAACCACTCCATCTTTTGTCGCTTTCACTGACACTGAAAGATTGATTGGTGATGCTGCTAAGAATCAAGCTGCTATGAATCCTTCGAATACCGTTTTCGACGCTAAGCGTTTGATCGGTAGAAACTTCAAC靶向因子

我有另一个ID为的文件:

YAL005C YAL012W

我想在与ID的文件匹配时检索序列和所有标题。

但我收到此错误:不打印任何内容!

请你能帮帮我吗?

提前致谢。

  • 我已经搜索了其他方法(我也无法得到结果)但我真的想知道这个错误!
  • no bioperl please!

2 个答案:

答案 0 :(得分:1)

好的,所以 - 第45行是:

     if (exists $ref_sp_names -> {$header_sub}) {

您的错误告诉您$header_sub未定义。它由设置

my $header_sub = $1;

以下内容:

     $key =~ m/^(>[A-Z])\s.+$/o;

所以 - 这意味着正则表达式不匹配。我没有在您的示例数据中看到任何>,因此无法与之匹配。当匹配失败时,$1未定义,因此您的错误。你从print $key陈述中得到了什么?

我还要注意 - .+$很可能是多余的。同样 - o标志 - 你可能也不想要那个。 http://perldoc.perl.org/perlre.html#Modifiers

答案 1 :(得分:0)

你尝试过使用Bioperl吗?这里有一些代码可以帮助您入门。

#!/usr/bin/perl
use warnings;
use strict;
use Bio::SeqIO;

my $fasta = shift; #this will just push whatever in cli in.
my $seqio_obj = Bio::SeqIO->(-file => $fasta, -format => 'fasta');

while ( my $seq = $seqio_obj->next_seq){
     print $seq->id . ' = ' . $seq->seq() . "\n";
     #in here you can do your fasta handling with the seq obj
}