我正在尝试删除一些垃圾并用关键数字替换单词,从以下字符串开始:
>ref|NC_035781.1|
>ref|NC_035782.1|
>ref|NC_035783.1|
>ref|NC_035784.1|
并想以以下方式结束:
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
我试过
sed 's/\>ref\|NC_03578\([0-9]\)\.1\|/>NC_03578\1\.1/g' chr.test | grep '>NC_'
对其进行测试并得到比预期更多的结果,如下所示:
>NC_03578.1>>NC_03578.1r>NC_03578.1e>NC_03578.1f>NC_03578.1|>NC_035780.1|>NC_03578.1 >NC_03578.1C>NC_03578.1r>NC_03578.1a>NC_03578.1s>NC_03578.1s>NC_03578.1o>NC_03578.1s>NC_03578.1t>NC_03578.1r>NC_03578.1e>NC_03578.1a>NC_03578.1
...
我究竟做错了什么?
答案1
主要问题是你已经逃脱>
并且|
我怀疑你正在使用GNU sed
.在这种情况下,\>
充当字边界结尾并将\|
充当交替运算符。
$ sed 's/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
修改后的命令如上所示。另外,行尾似乎有一些空格,所以我添加了.*
它们以删除它们。用于将操作sed -n '/NC_/ s/>ref|\(NC_03578[0-9]\.1\)|.*/>\1/p'
包含grep
在sed
其自身中
您还可以使用awk
$ awk -F'|' '/NC_/{print ">" $2}' chr.test
>NC_035781.1
>NC_035782.1
>NC_035783.1
>NC_035784.1
-F'|'
定义|
为字段分隔符。|
是一个正则表达式运算符,但是当FS
(由 设定的字段分隔符特殊 awk 变量-F
)是单个字符时,它不被视为正则表达式。-F'[|]'
或者-F'\\|'
也可以工作,但效率会较低。/NC_/
如果输入行包含NC_
print ">" $2
打印>
字符和第二个字段