【问题标题】:Perl code for reverse complement of DNA sequence用于 DNA 序列反向互补的 Perl 代码
【发布时间】:2021-04-25 17:36:24
【问题描述】:

我试图制作一个 perl 代码,以获取 .fna 文件格式的 fasta 序列 DNA 的反向补充。 sequence02C.fna 文件包含 100 条 DNA 序列:

>adbca3e
TGCTCCCCACGCTTGCCTCTCCAGTACTCAACCAAAGCAGTCTCTAGAAAAACAGTTTCCAACGCAATACGATGGAATTCCACTTCCCAAATATCTC
>4c2a958
TCCCCACGCTTTCGCGCTTCAGCGTCAGTATCTGTCCAGTGAGCTGACTTCTCCATCGGCATTCCTACACAGTACTCTAGAAAAACAGTTTCTGCTC
>0639b5b
TCGCGCCTCAGTGTCCAACGCAATACGAGTTGCAGACCAGGACACATGGAATTCCACTTCCCTCTCCAGTACTCAACCAAAGCAGTCTCTAGAAAAG

我使用了以下命令,它可以打开文件并进行反转,但在输出中不显示序列 ID(例如:>adbca3e)。

代码是:

#!/usr/local/perl

open (NS, "sequence02C.fna");
while (<NS>) {
    if ($_ =~ tr/ATGC/TACG/) {print $_;}
}

输出文件只是序列的互补而不是反向。 此外,它不包含序列 ID ">adbca3e"

任何人都可以建议适当的代码来立即执行此序列的反向互补并将结果放入输出文件吗?

【问题讨论】:

  • 也许你应该解释一下“互补”和“反向”的区别。
  • 要打印所有行,只需删除条件if。

标签: perl reverse dna-sequence complement


【解决方案1】:

您只打印包含A、T、G 或C 的行。你想打印每一行,所以打印不应该是有条件的。

#!/usr/local/perl

use strict;               # Always
use warnings;             # Always

while (<>) {
    if (/^>/) {           # Only modify lines starting with ">".
       tr/ATGC/TACG/;
       $_ = reverse($_);  # You didn't reverse.
    }

    print;                # Print undconditionally.
}

(tr///和print默认使用$_。)

注意我没有打开文件。您可以按如下方式使用该程序:

perl program.pl sequence02C.fna >sequence02C_revcomp.fna

或

perl -i~ program.pl sequence02C.fna

后者在原地修改文件。 (小心!先测试一下。不过,它确实会进行备份。)

【讨论】:

    【解决方案2】:

    你说你有一个“逆向”的程序,但它只提供互补。也许这对你来说是一个很明显的描述,但对我来说不是很清楚。

    如果“reverse”是指反向打印字符串,只需使用reverse 函数。补充我假设正在使用相应的核碱基,这就是你的音译的意思tr/ATGC/TACG/。

    要修复不打印 ID,只需删除打印语句中的 if 条件即可。

    我要做的只是将菱形运算符用于这样的小程序:

    use strict;
    use warnings;
    use feature 'say';
    
    while (<>) {
        chomp;
        unless (/^>/) {
            tr/ATGC/TACG/;            # transliterate non-ids
            my $reverse = reverse;    # reverse $_
            say $reverse;             # do something with $reverse
        }
        say;          # print current line
    }
    

    那么你可以像这样使用这个程序:

    $ perl program.pl sequence02C.fna > output.txt
    

    【讨论】:

    • 感谢@TLP 回复代码。我使用了以下程序,只是将 open 命令添加到建议的程序中: open (NS, "sequence02C.fna"); while () { 咀嚼;但发现错误输出:[siddiquee@intron2 realtask]$ perl rc.pl 语法错误在 rc.pl 第 13 行,靠近“我的”全局符号“$reverse”需要在 rc.pl 第 13 行显式包名称。全局符号“$ reverse" 需要在 rc.pl 第 14 行显示包名。由于编译错误,rc.pl 的执行被中止。
    • 全局符号 .. 是当您不使用 my 声明变量时。在你的情况下,听起来你错过了用分号结束一行,所以 my 被破坏了。但是,您在评论中显示的代码中看不到该错误。
    • @mashuk 我的代码中实际上缺少一个分号,现在添加它。
    • 非常感谢! @TLP
    猜你喜欢
    • 2013-09-17
    • 2014-10-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多