이름이 포함된 텍스트 파일에서 로마자로 표기된 한국어 이름을 찾고 일치하는 유형의 개수를 확인한 다음 개수를 인쇄하려고 합니다. 이를 위해 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.