AWK 스크립트 실행 시 구문 오류가 발생합니다.

AWK 스크립트 실행 시 구문 오류가 발생합니다.

이름이 포함된 텍스트 파일에서 로마자로 표기된 한국어 이름을 찾고 일치하는 유형의 개수를 확인한 다음 개수를 인쇄하려고 합니다. 이를 위해 AWK 스크립트를 만들었지만 이 스크립트를 실행하면 정규식 변수와 주변 두 번째 블록에서 구문 오류가 발생합니다 '{' '}'. 정규식 변수는 내 정규식 패턴을 보유합니다.

이것은 내 코드입니다.

BEGIN { 
    correctMatch = 0; 
    falsePositive = 0; 
    falseNegative = 0; 
    correctNonMatch = 0;  
    regex = (g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)? (g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)?-?(g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)?;
}

    {
        $NF=="Korean" && tolower($0)~regex {correctMatch = correctMatch + 1}
        $NF!="Korean" && tolower($0)~regex {falsePositive = falsePositive + 1}
        $NF=="Korean" && tolower($0)!~regex {falseNegative = falseNegative + 1}
        $NF!="Korean" && tolower($0)!~regex {correctNonMatch = correctNonMatch + 1}
    }

END {
    print "Correct Match:" correctMatch;
    print "False Positive:" falsePositive;
    print "False Negative:" falseNegative;
    print "Non Correct-Match:" correctNonMatch;
}

답변1

{...}주석에서 이미 언급했듯이 C 프로그램에서처럼 awk 작업 섹션 내의 작업 앞(즉, 사이)에 조건을 추가할 수는 없습니다 . 이 문제를 해결하고 기타 비효율성과 불필요한 코드 중복을 해결하려면 다음과 같이 변경하세요.

BEGIN {  
    regex = "(g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)? (g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)?-?(g|kk|n|d|tt|r|m|b|pp|s|ss|j|jj|ch|tch|k|t|p|h)?(a|ae|ya|yae|eo|e|yeo|ye|o|wa|wae|oe|yo|u|wo|we|wi|yu|eu|ui|i|oo|ah)(k|n|t|l|m|p|ng)?"
}
{
    hitNf = ( $NF == "Korean" )
    hitRe = ( tolower($0) ~ regex )
    correctMatch   += (  hitNf &&  hitRe )
    falsePositive  += ( !hitNf &&  hitRe )
    falseNegative  += (  hitNf && !hitRe )
    correcNonMatch += ( !hitNf && !hitRe )
}
END {
    print "Correct Match:" correctMatch+0
    print "False Positive:" falsePositive+0
    print "False Negative:" falseNegative+0
    print "Non Correct-Match:" correctNonMatch+0
}

위의 구조를 사용하면 변수에 먼저 저장하는 대신 정규식을 직접 테스트할 수 있습니다. 그런데 코드에서 regex = foo정규식을 변수에 저장하지 않습니다 regex. 위에서 이 문제를 수정했지만 regex = "foo"(동적 정규식) 최신 버전의 GNU awk도 이를 지원합니다 regex = @/foo/.https://www.gnu.org/software/gawk/manual/gawk.html#Compulated-Regexps그리고https://www.gnu.org/software/gawk/manual/gawk.html#Regexp-Constants.

관련 정보