.
私はシーケンスデータで作業していますが、 ""で始まらない行で""を""に置き換えるために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
は、next
fastaヘッダー行に会うたびにコードが実行されることです。これは、コードがヘッダーなしでシーケンスデータのみを生成することを意味します。シーケンスデータは問題ないようですが、あまり役に立ちません。
単にテストを否定し、next
ブロックを削除すると(またはnext
withの前にprint
)問題が解決しますawk
。しかし、これは私の個人的な意見です。単一文字を音訳するために(またはin)を使用するよりもinコマンドを使用する方がy
エレガントですsed
。gsub()
s///g
sed
答え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