您当然可以用awk
来做,但您可以使用sed
(例如,
$ sed 's/\(^[^|]*|\)\([^|]*\)\(.*$\)/\1\2_RESERVED\3/' yourfile
sp|Q9NYW0_RESERVED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens
sp|Q9NYV9_RESERVED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens
基本上使用的是3个反向引用在正常替代语法的匹配部分(例如\(...\)
之间捕获的字符的那些基团),例如
sed 's/match/replace/'
在你的情况,本场比赛是由我们要拍摄的第一回参考:
\(^[^|]*|\) # match from beginning '^' everything not '|', with the '|'
将被替换放回replace
与\1
(第一回参考)。接下来,我们同样收集登录号有:
\([^|]*\) # which just captures everything up to the next '|'
它将在replace
插入为\2_RESERVED
插入"accession number + _RESERVED"
你需要。最后,我们只是收集一切在其他行有:
\(.*$\) # which just says grab everything that remains '.*$'
把全replace
在一起\1\2_RESERVED\3
。
猛砸解决方案
如果你需要这样做在bash,那么就可以做得同样容易使用IFS
(内部字段分隔符)设置为'|'
分裂场和一个简单的read
循环。例如:
$ while IFS=$'|' read a b c; do echo "${a}|${b}_RESERVED|${c}"; done <yourfile
sp|Q9NYW0_RESERVED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens
sp|Q9NYV9_RESERVED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens
查看所有解决方案,并让我知道你是否有任何问题。