AWK/GAWK는 패턴 일치 후 문자를 추가합니다.

AWK/GAWK는 패턴 일치 후 문자를 추가합니다.

테스트 파일에는 다음과 같은 데이터 구조가 있습니다.

"111","222","AAABBB","333","444","555"

다음과 같이 세 번째 [AZ] 뒤에 "-"가 있도록 세 번째 필드를 변환하고 싶습니다.

"111","222","AAA-BBB","333","444","555"

분할() 기능을 사용하는 것이 해당 작업에 가장 적합한 도구입니까? 내가 시도한 것은 다음과 같습니다.

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); print seps[1]"/"seps[2]};' test

위 명령은 내가 원하는 것을 수행하지만 업데이트된 $3 필드를 포함하여 전체 줄을 어떻게 인쇄합니까? 결과:

AAA-BBB

답변1

짧은awk해결책:

awk 'BEGIN{ OFS=FS="," }{ sub(/[A-Z]{3}/, "&-", $3) }1' file
  • [A-Z]{3}- 대문자 3개와 일치하는 정규식 패턴
  • &- 정규식 패턴 일치의 정확한 하위 문자열을 나타냅니다.

산출:

"111","222","AAA-BBB","333","444","555"

답변2

에서는 awk필드 변수의 값을 다시 할당하면 값이 $0다시 계산됩니다.

$ echo "A B C" | awk '{ $2 = "two"; print $0 }'
A two C

귀하의 경우에는 다음과 같습니다.

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); $3 = seps[1]"-"seps[2]; print $0}' test

답변3

필요한 논리에 대한 설명이 100% 명확하지는 않지만 다음 Sed 명령이 예제 입력에 작동합니다.

sed 's/[A-Z]/&-/3' test-file.txt

관련 정보