我有一个包含临时 SNP ID 和等位基因的长文件,如下所示:
14_611646T,C
14_881226CT,C
14_861416.1GGC,GGCGCGCGCG
我想将每行的最后一个数字与字母分开(将 SNP ID 与等位基因分开)。所以看起来像这样:
14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG
我尝试了
awk
和sed
,但是,下划线不断造成问题。例如:
sed 's/^[0-9][0-9]*/& / File1 > File2
给了我
14 _611646T,C
14 _881226CT,C
14 _861416.1GGC,GGCGCGCGCGC
有人可以帮助我吗?
尝试了解实现这一目标的最明智的方法是什么。
最好避免使用匹配所有行的正则表达式,而是尝试找到需要更改的部分。
sed
与 -E
又名 E
xtented R
egex E
表达式 :sed -E 's/^[0-9_.]+/& /' file
14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG
节点 | 说明 |
---|---|
|
字符串锚点的开头 |
|
任何字符:“0”到“9”、“_”、“.” (1次或多次(匹配尽可能多的数量)) |
在
sed
的替换的右侧部分中,&
是左侧部分中匹配的内容。
sed 's/[[:upper:]]/ &/' file
[[:upper:]]
是一个 POSIX
正则表达式类,用于 所有大写字母。
sed 's/[[:alpha:]]/ &/'
在第一个非数字之前插入空格:
14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG
要在一行的最后一个数字和下一个非数字字符之间插入空格,可以使用
sed
,如下所示:
sed 's/\(.*[0-9]\)\([^0-9]\)/\1 \2/' file # BRE
sed -E 's/(.*[0-9])([^0-9])/\1 \2/' file # ERE
详情:
\(.*[0-9]\)
(BRE) / (.*[0-9])
(ERE) - 第 1 组(替换模式中的 \1
指的是捕获到该组中的值):任何文本,然后是数字(行中最后一次出现)\([^0-9]\)
(BRE) / ([^0-9])
(ERE) - 第 2 组(替换模式中的 \2
指的是捕获到该组中的值):非数字字符。在线查看 Bash 演示:
#!/bin/bash
s='14_611646T,C
14_881226CT,C
14_861416.1GGC,GGCGCGCGCG'
sed 's/\(.*[0-9]\)\([^0-9]\)/\1 \2/' <<< "$s"
sed -E 's/(.*[0-9])([^0-9])/\1 \2/' <<< "$s"
输出:
14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG