具有FASTA序列提取的Perl(仅)存在第一个序列的问题

时间:2019-01-17 07:23:51

标签: perl fasta

我正在使用Internet上可用的函数/子例程extract_seq来提取FASTA文件中的序列。简要地:

  • 序列以“>”标识的第一行开头,然后是ID和其他由空格分隔的信息
  • 后续行(不是以'>'开头的行具有多个字符串
  • FASTA文件可以包含1个或多个序列
  • 错误是输出的第一个序列(仅)有附加的'>'字符(导致一致性问题)。

程序在基于ID提取序列时工作得很好,除了第一个序列的情况下,其他'>'除外。您能否提出解决方案以及错误原因?一个简单的正则表达式可以解决该问题,但是我对修复无法理解的错误并不满意。

Perl脚本是:

    #!/usr/bin/perl -w

    use strict;

    my $seq_all = "seq_all.fa";    # all proteins in fasta format

    foreach my $q_seq ("A0A1D8PC43","A0A1D8PC38") {
        print "Querying $q_seq\n";
        &extract_seq($seq_all, $q_seq);
    }

exit 0;

sub extract_seq
{
    open(my $fh, ">query.seq");

    my $seq_all = $_[0];
    my $lookup = $_[1];

    local $/ = "\n>";

    @ARGV = ($seq_all);
    while (my $seq = <>) {
        chomp $seq;
        my ($id) = $seq =~ /^>*(\S+)/;
        if ($id eq $lookup) {
            print "$seq\n";
            last;
        }
    }
}

FASTA文件为:

>A0A1D8PC43 A0A1D8PC43_CANAL Diphosphomevalonate decarboxylase
MYSASVTAPVNIATLKYWGKRDKSLNLPTNSSISVTLSQDDLRTLTTASASESFEKDQLW
LNGKLESLDTPRTQACLADLRKLRASIEQSPDTPKLSQMKLHIVSENNFPTAAGLASSAA
GFAALVSAIAKLYELPQDMSELSKIARKGSGSACRSLFGGFVAWEMGTLPDGQDSKAVEI
APLEHWPSLRAVILVVSDDKKDTPSTTGMQSTVATSDLFAHRIAEVVPQRFEAMKKAILD
KDFPKFAELTMKDSNSFHAVCLDSYPPIFYLNDTSKKIIKMVETINQQEVVAAYTFDAGP
NAVIYYDEANQDKVLSLLYKHFGHVPGWKTHYTAETPVAGVSRIIQTSIGPGPQETSESL
TK
>A0A1D8PC56 A0A1D8PC56_CANAL Uncharacterized protein OS=Candida
MSDTKKTTETDSEVGYLDIYLRFNDDMEKDYCFQVKTTTVFKDLYKVFRTLPISLRPSVF
YHAQPIGFKKSVSPGYLTQDGNFIFDEDSQKQAVPVNDNDLINETVWPGQLILPVWQFND
FGFYSFLAFLACWLYTDLPDFISPTPGICLTNQMTKLMAWVLVQFGKDRFAETLLADLYD
TVGVGAQCVFFGFHIIKCLFIFGFLYTGVFNPMRVFRLTPRSVKLDVTKEELVKLGWTGT
RKATIDEYKEYYREFKINQHGGMIQAHRAGLFNTLRNLGVQLESGEGYNTPLTEENKLRT
MRQIVEDAKKPDFKLKLSYEYFAELGYVFATNAENKEGSELAQLIKQYRRYGLLVSDQRI
KTVVRARKGETDEEKPKVEEVVEE
>A0A1D8PC67 A0A1D8PC67_CANAL Bfa1p OS=Candida albicans (strain
MVSDKLTLLRQFSEEDELFGDIEGIDYHDGETLKINKFSFPSSASSPSFAITGQSPNMRS
INGKRITRETLSEYSEENETDLTSEFSDQEFEWDGFNKNQSIYQQMNQRLIATKVAKQRE
AEREQRELMQKRHKDYDPNQTLRLKDFNKLTNENLTLLDQLDDEKTVNYEYVRDDVEDFA
QGFDKDFETKLRIQPSMPTLRSNAPTLKKYKSYGEFKCDNRVKQKLDRIPSFYNKNQLLS
KFKETKSYHPHHKKMGTVRCLNNNSEVPVTYPSISNMKLNKEKNRWEGNDIDLIRFEKPS
LITHKENKTKKRQGNMVYDEQNLRWINIESEHDVFDDIPDLAVKQLQSPVRGLSQFTQRT
TSTTATATAPSKNNETQHSDFEISRKLVDKFQKEQAKIEKKINHWFIDTTSEFNTDHYWE
IRKMIIEE
>A0A1D8PC38 A0A1D8PC38_CANAL Cta2p OS=Candida albicans (strain
MPENLQTRLHNSLDEILKSSGYIFEVIDQNRKQSNVITSPNNELIQKSITQSLNGEIQNF
HAILDQTVSKLNDAEWCLGVMVEKKKKHDELKVKEEAARKKREEEAKKKEEEAKKKAEEA
KKKEEEAKKAEEAKKAEEAKKVEEAAKKAEEAKKAEEEARKKAETAPQKFDNFDDFIGFD
INDNTNDEDMLSNMDYEDLKLDDKVPATTDNNLDMNNILENDESILDGLNMTLLDNGDHV
NEEFDVDSFLNQFGN

编辑: 如上所述,我面临的问题是输出对于第一个序列(仅)具有附加的“>”字符。我看不出相同的原因,这造成了很多麻烦。输出为:

Querying A0A1D8PC43
>A0A1D8PC43 A0A1D8PC43_CANAL Diphosphomevalonate decarboxylase
MYSASVTAPVNIATLKYWGKRDKSLNLPTNSSISVTLSQDDLRTLTTASASESFEKDQLW
LNGKLESLDTPRTQACLADLRKLRASIEQSPDTPKLSQMKLHIVSENNFPTAAGLASSAA
GFAALVSAIAKLYELPQDMSELSKIARKGSGSACRSLFGGFVAWEMGTLPDGQDSKAVEI
APLEHWPSLRAVILVVSDDKKDTPSTTGMQSTVATSDLFAHRIAEVVPQRFEAMKKAILD
KDFPKFAELTMKDSNSFHAVCLDSYPPIFYLNDTSKKIIKMVETINQQEVVAAYTFDAGP
NAVIYYDEANQDKVLSLLYKHFGHVPGWKTHYTAETPVAGVSRIIQTSIGPGPQETSESL
TK
Querying A0A1D8PC38
A0A1D8PC38 A0A1D8PC38_CANAL Cta2p OS=Candida albicans (strain
MPENLQTRLHNSLDEILKSSGYIFEVIDQNRKQSNVITSPNNELIQKSITQSLNGEIQNF
HAILDQTVSKLNDAEWCLGVMVEKKKKHDELKVKEEAARKKREEEAKKKEEEAKKKAEEA
KKKEEEAKKAEEAKKAEEAKKVEEAAKKAEEAKKAEEEARKKAETAPQKFDNFDDFIGFD
INDNTNDEDMLSNMDYEDLKLDDKVPATTDNNLDMNNILENDESILDGLNMTLLDNGDHV
NEEFDVDSFLNQFGN

2 个答案:

答案 0 :(得分:1)

$/是输入记录分隔符,设置local $/="\n>";的作用是将输入拆分为以\n>结尾的记录,经过斩断后,该结尾将被删除,但是/>*(\S+)/可能不匹配,因为>是从先前的记录中消耗的。

在FASTA维基百科中,以>开头的行是注释,不一定总是id。但是,如果总是这样,则可能会解决以下问题。

my ($id,$seq) = $seq =~ /^>*(.*)\n(\S+)/;

答案 1 :(得分:1)

您将记录分隔符设置为\n>。这不适用于第一个序列。

固定的代码顺序:

...
chomp $seq;

# for first sequence
$seq =~ s/^>//;

my ($id) = $seq =~ /^(\S+)/;
if ($id eq $lookup) {
...

请注意,您的实现效率极低,因为它会读取并解析每个查询的文件内容。如何将加载/解析和查询拆分为单独的函数?

替代解决方案:将查找值的完整列表提供给加载程序。然后在读取文件时遇到匹配项时,它将填充一个答案数组。