用单线Perl打印DNA的反向补体

用单线Perl打印DNA的反向补体,perl,bash,sequence,Perl,Bash,Sequence,我想编写一个快速的单行perl脚本来生成DNA序列的反向补码。但是,以下内容不适用于我: $ cat sample.dna.sequence.txt | perl -ne '{while (<>) {$seq = $_; $seq =~ tr /atcgATCG/tagcTAGC/; $revComp = reverse($seq); print $revComp;}}' $cat sample.dna.sequence.txt | perl-ne'{while(){$seq=$\

我想编写一个快速的单行perl脚本来生成DNA序列的反向补码。但是,以下内容不适用于我:

$ cat sample.dna.sequence.txt | perl -ne '{while (<>) {$seq = $_; $seq =~ tr /atcgATCG/tagcTAGC/; $revComp = reverse($seq); print $revComp;}}'
$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
tr-d“\n”

可以在bash中使用,但我想在实践中使用perl

您的问题是您同时使用了
-n
while(){}
,因此您最终使用的是
while(){while(){}



如果你知道如何做
,你的问题是你同时使用了
-n
while(){}
,因此你最终得到了
while(){while(){}



如果您知道如何使用cat,那么下面的一行代码应该适合您

ewolf@~ $cat foo.txt
atNgNt
gatcGn

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

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

ewolf@~ $cat foo.txt
atNgNt
gatcGn

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

考虑到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="">

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

考虑到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="">

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

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

顺便提一下,一个完整的补码模式,包括模棱两可的基,是:

tr/atgcbvdhrykm/TACGVBHDYRMKtacgvbhdyrmk/

模棱两可的碱基也有补语。例如,
V
代表
a
C
G
。它们的补语是
T
G
,和
C
,这是由模糊的基
B
表示的。因此,
V
B
是互补的


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

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

顺便提一下,一个完整的补码模式,包括模棱两可的基,是:

tr/atgcbvdhrykm/TACGVBHDYRMKtacgvbhdyrmk/

模棱两可的碱基也有补语。例如,
V
代表
a
C
G
。它们的补语是
T
G
,和
C
,这是由模糊的基
B
表示的。因此,
V
B
是互补的


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

我刚刚意识到我的答案是重复的,但是我添加了一个关于模棱两可的基础的额外注释…我刚刚意识到我的答案是重复的,但是我添加了一个关于模棱两可的基础的额外注释。。。
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