awk
으로 확실히 할 수 있지만 sed
으로 쉽게 할 수 있습니다. 본질적으로 3 다시 참조 정상 대체 구문의 정합 부분 (\(...\)
사이에 포획 자 예컨대 해당 그룹), 예를 사용
$ 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
귀하의 경우에는
sed 's/match/replace/'
이 경기는 우리가 캡처하고자하는 첫 번째 역 참조로 구성되어 있습니다 :
\1
(첫 번째 역 참조)와
replace
에 다시 넣어 대체됩니다
\(^[^|]*|\) # match from beginning '^' everything not '|', with the '|'
. "accession number + _RESERVED"
당신이 필요로하는 삽입 \2_RESERVED
로
\([^|]*\) # which just captures everything up to the next '|'
그것은
replace
에 삽입됩니다
: 다음, 우리는 유사과 가입 번호를 수집합니다. \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
질문이 있으면 알려주세요.