我是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脚本中的一个简单的语法错误...希望获得有关获得所需结果的任何指导。
答案 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;
}
希望逻辑如何运作更清楚?