我想写一个快速的单行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来练习。
答案 0 :(得分:7)
您的问题是您同时使用-n
和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
答案 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 >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
代表A
,C
或G
。他们的补充是T
,G
和C
,由不明确的基础B
表示。因此,V
和B
是互补的。
您不需要在tr模式中包含任何N或n(如另一个答案中所示),因为补语是相同的,将它们排除会使它们保持不变。只需要额外的处理就可以将它们放在模式中。