我正在处理序列数据,但我愚蠢地找不到使用 awk在不以“”开头的行中用“”替换.
“”的正确方法。我真的需要使用 awk 而不是 sed。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
,但是,这是我个人的观点,使用命令y
in比使用(或in )来音译单个字符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