使用"不可用序列删除标识符"来自FASTA文件

时间:2018-02-02 05:57:02

标签: regex perl sequence fasta

我是perl和regex的新手,但是已经使用了本文的指导来尝试删除FASTA文件中的基因序列,这些基因序列具有"序列不可用"或"没有UTR注释......"对于给定的标识符: https://www.biostars.org/p/127842/

不幸的是,我的perl脚本没有产生预期的结果。脚本如下:

 #!/usr/bin/perl
use strict;
use warnings;

$/="\n>";

while (<>) {

 s/>//g;

  my ($id, $seq) = split (/\n/, $_);

  print ">$_" if ((length $seq) > 10 && ($seq !~ "Sequence unavailable" or $seq !~ "No UTR is annotated for this transcript"));

}

输入文件如下所示:

>AT1G02810|AT1G02810.1
CTGTGAGCCTATGGCATATGTACCACGTTAAGATTTAAGAAAATCTGGAATAAAAAATGC
AACTAGATATTATGTTATACAAATCTAGGCCAGAGTCGGTTGTTTTCGGACCGTTCTGCC
GTGAAACTGTGTTCCTTAACATTTTGATTTAACGTTTCCATATTTCTGACATTCCAATAA
ATTATTGATAACTAGTAATTAATTAAAACGGTTTACTCTGAACTCTGAAGTGTGTGAGGT
>AT1G04635|AT1G04635.1
Sequence unavailable
> ...

我的脚本的输出文件如下:

>CTGTGAGCCTATGGCATATGTACCACGTTAAGATTTAAGAAAATCTGGAATAAAAAATGC
AACTAGATATTATGTTATACAAATCTAGGCCAGAGTCGGTTGTTTTCGGACCGTTCTGCC
GTGAAACTGTGTTCCTTAACATTTTGATTTAACGTTTCCATATTTCTGACATTCCAATAA
ATTATTGATAACTAGTAATTAATTAAAACGGTTTACTCTGAACTCTGAAGTGTGTGAGGT
> ...

但是,我的DESIRED输出将是:

>AT1G02810|AT1G02810.1
CTGTGAGCCTATGGCATATGTACCACGTTAAGATTTAAGAAAATCTGGAATAAAAAATGC
AACTAGATATTATGTTATACAAATCTAGGCCAGAGTCGGTTGTTTTCGGACCGTTCTGCC
GTGAAACTGTGTTCCTTAACATTTTGATTTAACGTTTCCATATTTCTGACATTCCAATAA
ATTATTGATAACTAGTAATTAATTAAAACGGTTTACTCTGAACTCTGAAGTGTGTGAGGT
> ...

根据我的理解,我希望这是我的perl脚本中的一个简单的语法错误...希望获得有关获得所需结果的任何指导。

1 个答案:

答案 0 :(得分:0)

好的,所以问题的根源是你的条件表达式:

print ">$_" if ((length $seq) > 10 && ($seq !~ "Sequence unavailable" or $seq !~ "No UTR is annotated for this transcript"));

特别是 - 因为你有一个否定的“或”条件 - not或者总是是“true”,因为当你有“Sequence unavailable”时$seq !~ "No UTR is annotated for this transcript"将评估为true 。

分解它 - 在括号外移动'not':

print ">$_" if ((length $seq) > 10 and not ($seq =~ /Sequence unavailable/ or $seq =~ /No UTR is annotated for this transcript/));

或者更好的是 - 将条件分开,并使用next if类型构造跳过:

#!/usr/bin/perl
use strict;
use warnings;

$/ = "\n>";

while (<>) {

   my ( $id, $seq ) = split /\n/, ;

   next if $seq =~ m/Sequence unavailable/;
   next if $seq =~ m/No UTR is annotated for this transcript/;
   next unless length $seq > 10;
   print;

}

希望逻辑如何运作更清楚?