用单线Perl打印DNA的反向补体
我想编写一个快速的单行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=$\
$ 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 >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 >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