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
块(或在next
with 之前print
)将为您解决它awk
,但是,这是我个人的意见,使用y
in 命令sed
比使用gsub()
(或s///g
in sed
)来音译单个字符更优雅。
您可以尝试:
awk '!/^>/ { gsub(/\./, "X") }1' Sfr.pep > Sfr2.pep
Run Code Online (Sandbox Code Playgroud)
输出:
>sequence.1
GTCAGTCAGTCAXGTCAGTCA
Run Code Online (Sandbox Code Playgroud)