테스트 파일에는 다음과 같은 데이터 구조가 있습니다.
"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