確かにそれは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/'
、試合は我々が捕獲したい最初の後方参照で構成されています。\1
(最初の後方参照)で逆replace
入れ置き換えられます
\(^[^|]*|\) # match from beginning '^' everything not '|', with the '|'
。それはあなたが必要としている"accession number + _RESERVED"
を挿入\2_RESERVED
としてreplace
に挿入されます
\([^|]*\) # which just captures everything up to the next '|'
:次に、我々は同様にアクセッション番号を集めます。 \1\2_RESERVED\3
として一緒にフルreplace
を置く
\(.*$\) # which just says grab everything that remains '.*$'
:最後に、私たちはちょうどに沿って、他のすべてを収集しました。
バッシュソリューション
あなたは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
質問がある場合は、私に教えてください。