1

我想编写一个快速的单行 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

4 回答 4

7

你的问题是你同时使用-nand while (<>) { },所以你最终得到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
于 2013-04-29T19:06:23.633 回答
0

如果您需要使用 cat,以下一种衬里应该适合您。

ewolf@~ $cat foo.txt
atNgNt
gatcGn

ewolf@~ $cat foo.txt | perl -ne '$seq = $_; $seq =~ tr/atcgATCG/tagcTAGC/;print reverse( $seq )'
taNcNa
ctagCn
于 2013-04-29T21:05:29.697 回答
0

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

顺便说一句,一个完整的补码tr模式,包括不明确的碱基,是:

tr/ATGCBVDHRYKMatgcbvdhrykm/TACGVBHDYRMKtacgvbhdyrmk/

模棱两可的碱基也有补语。例如,aV代表ACG。它们的补码是T,GC, 由模棱两可的基数表示B。因此,VB是互补的。

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

于 2017-11-16T17:44:38.903 回答
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

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

于 2016-10-13T13:12:19.680 回答