您當然可以用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
查看所有解決方案,並讓我知道你是否有任何問題。