1

DNA のシーケンスの逆補数を生成する簡単な単一行の perl スクリプトを作成したいと考えています。ただし、次のことはうまくいきません。

$ 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

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 に答える
0

問題は、perl フラグで -n を使用しているにもかかわらず、独自のループを作成していることです。 -n提供されたコードを while ループのようにラップしますwhile(<STDIN>){...}。したがって、STDINファイルハンドルは既に読み取られており、コードはそれを再度実行し、EOF(ファイルの終わり) または「未定義」を取得します。nfromを削除する-newhile、コードからループを削除する必要があります。

trちなみに、あいまいなベースを含む完全な補完パターンは次のとおりです。

tr/ATGCBVDHRYKMatgcbvdhrykm/TACGVBHDYRMKtacgvbhdyrmk/

あいまいなベースにも補数があります。たとえば、aVAC、またはを表しGます。それらの補語はTG、およびCであり、あいまいな基数 で表されBます。したがって、VBは補完的です。

補数は同じであり、それらを除外するとそのままになるため、 tr パターンに N または n を含める必要はありません (別の回答で示されているように)。それらをパターンに入れるのは単なる余分な処理です。

于 2017-11-16T17:44:38.903 に答える