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

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

.私はシーケンスデータで作業していますが、 ""で始まらない行で""を""に置き換えるためにawkを使用する正しい方法を愚かに見つけることができません。 sedの代わりにawkを使用する必要があります。X>

これまで持っていますが、「.」をすべて置き換えたのは次のとおりです。

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

サブデータの例:

>sequence.1
GTCAGTCAGTCA.GTCAGTCA

私が得たい結果:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

答え1

そうすることがより自然に見えますsed

sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep

^>これは現在の行と一致します(「行は>文字で始まりますか?」)。この表現があればいいえmatch、このyコマンドは線の各点をに変更するために使用されますX

テスト:

$ cat Sfr.pep
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
$ sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
$ cat Sfr2.pep
>sequence.1
GTCAGTCAGTCAXGTCAGTCA

コードの主な問題awkは、nextfastaヘッダー行に会うたびにコードが実行されることです。これは、コードがヘッダーなしでシーケンスデータのみを生成することを意味します。シーケンスデータは問題ないようですが、あまり役に立ちません。

単にテストを否定し、nextブロックを削除すると(またはnextwithの前にprint)問題が解決しますawk。しかし、これは私の個人的な意見です。単一文字を音訳するために(またはin)を使用するよりもinコマンドを使用する方がyエレガントですsedgsub()s///gsed

答え2

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

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

出力:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

答え3

で始まる行は印刷せず、置換が行われた行のみを>印刷します。print次の行に移動する前に印刷するには、コマンドを使用します。

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

答え4

#!/usr/bin/python
import re
g=re.compile(r'^>')
rep=re.compile(r'\.')
k=open('file','r')
for b in k:
    if not re.search(g,b):
        er=re.sub(rep,"X",b)
        print er.strip()
    else:
        print b.strip()

出力

>sequence.1
GTCAGTCAGTCAXGTCAGTCA

関連情報