web-dev-qa-db-ja.com

">"で始まらない行の文字を置き換えるAWK

シーケンスデータを使用していますが、「.」で始まっていない行で「>」を「X」に置き換える正しい方法を愚かに見つけられません。私は本当にawkを使う必要があり、sedではありません。

私はここまでたどり着きましたが、単にすべて「。」このように置き換えられます:

awk '/^>/ {next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep

サブデータの例:

>sequence.1
GTCAGTCAGTCA.GTCAGTCA

取得したい結果:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA
5
TUnix

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ブロックを削除する(またはnextprintの前に付ける)と、awkで解決できますが、これは私の個人的な意見です。ysedコマンドを使用する方が、gsub()(またはsedの_s///g_)は、単一の文字を音訳するために使用します。

10
Kusalananda

あなたは試すことができます:

awk '!/^>/ { gsub(/\./, "X") }1' Sfr.pep > Sfr2.pep

出力:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

>で始まる行を印刷するのではなく、置換を実行する行のみを印刷します。次の行にスキップする前に、printコマンドを使用して印刷します。

awk '/^>/ {print;next} {gsub(/\./,"X")}1' Sfr.pep > Sfr2.pep
1
Barmar