【问题标题】:Removing identifier with "unavailable sequence" from FASTA file从 FASTA 文件中删除带有“不可用序列”的标识符
【发布时间】:2018-07-12 14:12:01
【问题描述】:

我是 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
> ...

但是,我期望的输出是:

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

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

【问题讨论】:

  • 如果您不发布工作代码,我们无法帮助您解决问题。我猜你是从文本编辑器粘贴的,它被截断了长行。
  • 是的,你是对的,只是在我复制代码时我的想法滑落了。我已经用正确的行更新了原始帖子。

标签: regex perl sequence fasta


【解决方案1】:

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

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

特别是 - 因为你有一个否定的“或”条件 - 非或将总是为“真”,因为当你有“序列不可用”时$seq !~ "No UTR is annotated for this transcript" 将评估为真。

所以分解它 - 将'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;

}

希望哪个更清楚逻辑是如何运作的?

【讨论】:

  • 您好,谢谢您的建议!我尝试了这条线,但仍然得到相同的输出 - 它仍在删除每条记录的 ID/基因名称,而不仅仅是包含感兴趣字符串的那些。
猜你喜欢
  • 2014-05-18
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2022-08-19
  • 2014-11-26
相关资源
最近更新 更多