我试图制作一个perl代码,以.fna文件格式获得DNA的fasta序列的反向补码。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"0">adbca3e";
有人能建议合适的代码立即对这个序列进行反向互补,并将结果放入输出文件中吗?
只打印包含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
后者在适当的位置修改文件。(小心!先测试一下。不过它确实可以备份。(
你说你有一个程序"使反向";,但它只是互补的。也许这对你来说是一个非常明显的描述,但对我来说不是很清楚
如果通过";反向";您的意思是向后打印字符串,只需使用reverse
函数即可。互补I假设取相应的核碱基,这就是你的音译tr/ATGC/TACG/
的意思。
要修复不打印id的问题,只需删除print语句上的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