gensub를 사용해도 일치 항목이 대체되지 않습니다.

gensub를 사용해도 일치 항목이 대체되지 않습니다.

첫 번째 열에 다음과 같은 항목이 포함된 탭으로 구분된 파일이 있습니다.

sp|O00253|AGRP_HUMAN

awk열 1의 s 사이의 텍스트 |와 나머지 열의 나머지 텍스트만 변경되지 않은 새 파일을 출력하는 데 사용하려고 합니다 .

정규식

/\w{2}\|(\w+)\|\w+/

O00253캡처 그룹에서 원하는 text()와 일치 하지만 사용할 $1수 없습니다 .awkgensub

아래 줄 주위에서 여러 번 반복을 시도했지만 모든 것이 변경되지 않은 캡처 그룹을 반환합니다.

awk 'gensub(/\w{2}\|(\w+)\|\w+/,"\\1","g",$1) {print}'

awk '{print gensub(/\w{2}\|(\w+)\|\w+/,"\\1","g",$0)}'

내가 무엇을 놓치고 있나요?

답변1

두 번째 솔루션은 여기서 잘 작동합니다. 첫 번째 이유는 다음과 같습니다.gensub

함수의 결과로 수정된 문자열을 반환합니다. 원래 대상 문자열은 변경되지 않습니다..1

결과를 변수에 할당한 다음 업데이트할 수 있습니다 $1.

awk '{x=gensub(/\w{2}\|(\w+)\|\w+/,"\\1","1",$1);$1=x};1' infile

나는 이것을 할 것이지만 :

awk '{split($1,arr,"|");$1=arr[2]};1' infile

관련 정보