シーケンスデータを使用していますが、「.
」で始まっていない行で「>
」を「X
」に置き換える正しい方法を愚かに見つけられません。私は本当にawkを使う必要があり、sedではありません。
私はここまでたどり着きましたが、単にすべて「。」このように置き換えられます:
awk '/^>/ {next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep
サブデータの例:
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
取得したい結果:
>sequence.1
GTCAGTCAGTCAXGTCAGTCA
sed
でこれを行うのがより自然なようです。
_sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
_
これは、現在の行に対して_^>
_を照合します(「この行は_>
_文字で始まりますか?」)。その式がnotに一致する場合、y
コマンドを使用して、その行の各ドットをX
に変更します。
テスト:
_$ cat Sfr.pep
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
_
_$ sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
_
_$ cat Sfr2.pep
>sequence.1
GTCAGTCAGTCAXGTCAGTCA
_
awk
コードの主な問題は、fastaヘッダー行に遭遇したときにnext
が実行されることです。つまり、コード化すると、ヘッダーなしでシーケンスデータのみが生成されます。このシーケンスデータは問題ないように見えますが、それほど役に立ちません。
テストを否定してnext
ブロックを削除する(またはnext
をprint
の前に付ける)と、awk
で解決できますが、これは私の個人的な意見です。y
でsed
コマンドを使用する方が、gsub()
(またはsed
の_s///g
_)は、単一の文字を音訳するために使用します。
あなたは試すことができます:
awk '!/^>/ { gsub(/\./, "X") }1' Sfr.pep > Sfr2.pep
出力:
>sequence.1
GTCAGTCAGTCAXGTCAGTCA
>
で始まる行を印刷するのではなく、置換を実行する行のみを印刷します。次の行にスキップする前に、print
コマンドを使用して印刷します。
awk '/^>/ {print;next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep