AWK 替换不以 ">" 开头的行的字符

AWK 替换不以 ">" 开头的行的字符

我正在处理序列数据,但我愚蠢地找不到使用 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块(或在nextwith之前print)即可为您解决问题awk,但是,这是我个人的观点,使用命令yin比使用(或in )来音译单个字符sed更优雅。gsub()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

相关内容