在单行Perl中打印反向DNA补体

时间:2013-04-29 18:55:09

标签: perl bash sequence

我想写一个快速的单行perl脚本来产生DNA序列的反向互补。但是,以下内容对我不起作用:

$ cat sample.dna.sequence.txt | perl -ne '{while (<>) {$seq = $_; $seq =~ tr /atcgATCG/tagcTAGC/; $revComp = reverse($seq); print $revComp;}}'

有什么建议吗?我知道

tr -d "\n " < input.txt | tr "[ATGCatgcNn]" "[TACGtacgNn]" | rev

在bash中工作,但我想用perl来练习。

4 个答案:

答案 0 :(得分:7)

您的问题是您同时使用-nwhile (<>) { },因此您最终会使用while (<>) { while (<>) { } }


如果你知道怎么做<file.txt,为什么要切换到cat file.txt|


perl -0777ne's/\n //g; tr/ATGCatgcNn/TACGtacgNn/; print scalar reverse $_;' input.txt

perl -0777pe's/\n //g; tr/ATGCatgcNn/TACGtacgNn/; $_ = reverse $_;' input.txt

或者,如果您不需要删除换行符:

perl -pe'tr/ATGCatgcNn/TACGtacgNn/; $_ = reverse $_;' input.txt

答案 1 :(得分:0)

如果您需要使用猫,以下一个衬垫应该适合您。

ewolf@~ $cat foo.txt
atNgNt
gatcGn

ewolf@~ $cat foo.txt | perl -ne '$seq = $_; $seq =~ tr/atcgATCG/tagcTAGC/;print reverse( $seq )'
taNcNa
ctagCn

答案 2 :(得分:0)

在multifasta文件中考虑单行格式的DNA序列:

cat multifasta_file.txt | while IFS= read L; do if [[ $L == >* ]]; then echo "$L"; else echo $L | rev | tr "ATGCatgc" "TACGtacg"; fi; done > output_file.txt

如果您的multifasta文件不是单行格式,您可以在使用上述命令之前将文件转换为单行,如下所示:

awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);} END {printf("\n");}' <multifasta_file.txt &gt;multifasta_file_singleline.txt<="" p="">

然后,

cat multifasta_file_SingleLine.txt | while IFS= read L; do if [[ $L == >* ]]; then echo "$L"; else echo $L | rev | tr "ATGCatgc" "TACGtacg"; fi; done > output_file.txt

希望它对某人有用。我花了一些时间来构建它。

答案 3 :(得分:0)

问题是你在perl标志中使用-n,但你已经编写了自己的循环。 -n将您提供的代码包装在while(<STDIN>){...}之类的while循环中。因此,STDIN文件句柄已被读取,您的代码再次执行,获取EOF(文件结束)或更确切地说是“未定义”。您需要从n中删除-ne或从代码中删除while循环。

顺便提一下,完整的补充tr模式,包括模糊的基础,是:

tr/ATGCBVDHRYKMatgcbvdhrykm/TACGVBHDYRMKtacgvbhdyrmk/

模棱两可的基础也有补充。例如,V代表ACG。他们的补充是TGC,由不明确的基础B表示。因此,VB是互补的。

您不需要在tr模式中包含任何N或n(如另一个答案中所示),因为补语是相同的,将它们排除会使它们保持不变。只需要额外的处理就可以将它们放在模式中。