有人在微信群里问到这样一个问题:
请问我想把参考基因组中所有的A和C替换成C和A,小写也按照这样的规则替换,该怎么实现呢,tr可以做到,但是我想保证>后面的染色体名字不会被替换?
tr
命令确实可以完成文本字符替换一对一的映射,但很显然,这样的功能想要解决这个问题是不够的,它把不想要改变的文本也改变了。
解决问题的思路在于如何实现带>标志的文本直接输出,而DNA字符行被执行转换命令。这个问题其实使用sed命令就可以快速解决,不少朋友对于sed
的使用可能记忆为我在笔记中写的:
command/pattern/replacement/flag
command
是一些命令,比如s
,d
等,flag
是一些标记,i
,g
等等。
这样认识sed命令其实不是很全面,sed允许指定文本模式来过滤出命令要作用的行,格式如下:
/pattern/command
所以整理起来,sed格式其实(除了一些选项)为
/pattern/command/pattern/replacement/flag
第一个pattern
用来过滤出要处理的文本行,第二个pattern
是sed命令要作用的模式。
那么利用这个特定,一开始的问题可以利用正则表达式非常简单地解决了:
先用/^[^>]/
找到不以>
开始的行,然后执行sed
字符转换命令。
# 随便写一个测试文本
$ cat test
> CAACCA
acgtACGTACTGagct
tacgactNNNNNNNNNNNNNNNN
$ cat test | sed '/^[^>]/y/ACac/CAca/'
> CAACCA
cagtCAGTCATGcgat
tcagcatNNNNNNNNNNNNNNNN
有兴趣的可以看看初识sed与awk这篇笔记。