텍스트가 정규식과 일치하면 awk가 이를 대체합니다. 그렇지 않은 경우 다른 것으로 교체하십시오. awk를 사용하여 이를 달성할 수 있습니까?

텍스트가 정규식과 일치하면 awk가 이를 대체합니다. 그렇지 않은 경우 다른 것으로 교체하십시오. awk를 사용하여 이를 달성할 수 있습니까?

다음 레코드가 포함된 파일의 경우:

ABC|YE0000123543|BLAH|XYZ|24.12.2025|J
ABC|YE0000123544|BLAH|MNO|24.12.2025|K

네 번째 필드에 XYZ가 포함되어 있으면 이를 Y로 바꿉니다. 그렇지 않다면 N으로 교체하세요.

간단하게 들리죠? 분명히 괜찮아아니요awk와 무언가를 일치시키는 것은 불가능하지는 않더라도 매우 어렵거나 이해가 되지 않습니다.

대체 게임:

$ echo "ABC|YE0000123543|BLAH|XYZ|24.12.2025|J"|awk -F '|' 'BEGIN { OFS=FS } {gsub(/XYZ/, "Y", $4);} {print $0}'
ABC|YE0000123543|BLAH|Y|24.12.2025|J

여태까지는 그런대로 잘됐다! 이제 불일치를 나타내기 위해 N을 인쇄합니다.

정규식을 무효화하면 됩니다. 그렇죠?!/XYZ/

$ echo "ABC|YE0000123543|BLAH|MNO|24.12.2025|J"|awk -F '|' 'BEGIN { OFS=FS } {gsub(!/XYZ/, "N", $4);} {print $0}'
ABC|YE0000123543|BLAH|MNO|24.12.2025|J

아니요? 그것은 단지 작동하지 않습니다.

보고 있다다른 답변그래서 나를 단서가 없게 만듭니다. awk에서 비교할 수 없는 정규 표현식을 대체할 수 있는 믿을 만한 대체품은 없는 것 같습니다.

어떤 조언이라도 대단히 감사하겠습니다.

답변1

@Romeo도 제안했듯이 문자열 동일성은 정규 표현식보다 더 정확할 수 있습니다.

난 쓸수있다

awk 'BEGIN {FS=OFS="|"} {$4 = ($4 == "XYZ" ? "Y" : "N")} 1' file

답변2

다음과 같이 스크립트를 변경할 수 있습니다.

$ awk -F '|' 'BEGIN { OFS=FS } {if("XYZ"==$4) $4="Y" ;else $4="N"; print }' input_file >output_file

답변3

고양이 가죽을 벗기는 방법은 셀 수 없이 많죠... 4번 필드 전체를 교체하고 싶으신 것 같죠? "조건부" 연산자를 사용해 보십시오:

awk -F '|' '{$4=($4=="XYZ")?"Y":"N"} 1' OFS="|" file5
ABC|YE0000123543|BLAH|Y|24.12.2025|J
ABC|YE0000123544|BLAH|N|24.12.2025|K

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne 'my @a = .split("|"); @a.[3] eq "XYZ" ?? (@a.[3] = "Y") !! (@a.[3] = "N"); @a.join("|").put;'  file

또는

~$ raku -ne 'my @a = .split("|"); @a.[3] = (@a.[3] eq "XYZ" ?? "Y" !! "N"); @a.join("|").put;'  file

반드시 그럴까요 awk? 다음은 Raku의 삼항 연산자인 "(조건) ??True !!False" 를 사용한 솔루션입니다 . 위의 split/ 메소드의 좋은 점은 join쉼표 연결을 사용하여 간단한 파일을 생성하려는 경우 csv이를 설정할 수 있다는 것 입니다. 그렇지 않으면 Raku의 내용은 awk게시된 답변과 유사하며 Raku(및 Perl5)는 인덱스가 0이라는 점입니다.

https://docs.raku.org/언어/operators#index-entry-operator_ternary
https://raku.org

관련 정보