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

TUn*_*nix 5 awk text-processing bioinformatics

我正在处理序列数据,但我愚蠢地找不到使用 awk 将不以“ ”开头的行中.的“ X”替换为“ ”的正确方法>。我真的需要使用 awk 而不是 sed。

我已经到了这一步,但只是所有的“。” 以这种方式替换:

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

示例子数据:

>sequence.1
GTCAGTCAGTCA.GTCAGTCA
Run Code Online (Sandbox Code Playgroud)

我想得到的结果:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 10

这样做似乎更自然sed

sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
Run Code Online (Sandbox Code Playgroud)

这将与^>当前行匹配(“此行是否以>字符开头?”)。如果该表达式并匹配,则该y命令用于改变各点在该行X

测试:

$ cat Sfr.pep
>sequence.1
GTCAGTCAGTCA.GTCAGTCA
Run Code Online (Sandbox Code Playgroud)
$ sed '/^>/!y/./X/' Sfr.pep >Sfr2.pep
Run Code Online (Sandbox Code Playgroud)
$ cat Sfr2.pep
>sequence.1
GTCAGTCAGTCAXGTCAGTCA
Run Code Online (Sandbox Code Playgroud)

您的awk代码的主要问题next是每当您遇到 fasta 标题行时就会执行该代码。这意味着您的编码只产生序列数据,没有标题。尽管该序列数据看起来应该没问题,但这不会有太大帮助。

简单地否定测试并删除next块(或在nextwith 之前print)将为您解决它awk,但是,这是我个人的意见,使用yin 命令sed比使用gsub()(或s///gin sed)来音译单个字符更优雅。

  • @TUnix 那是因为你在 `s` 命令的末尾缺少 `/g`。你的 `sed` 方法只会替换每一行的 _first_ 点,就像你在 `awk` 中使用 `sub()` 代替 `gsub()` 一样。 (3认同)

sch*_*ity 8

您可以尝试:

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

输出:

>sequence.1
GTCAGTCAGTCAXGTCAGTCA
Run Code Online (Sandbox Code Playgroud)