AWK의 END 블록에 "if"를 쓰지 않으면 구문 오류가 발생하는 이유는 무엇입니까?

AWK의 END 블록에 "if"를 쓰지 않으면 구문 오류가 발생하는 이유는 무엇입니까?

요즘에는 텍스트 처리를 위해 AWK를 배우고 있습니다. 하지만 저는 AWK 구문에 대해 매우 혼란스러워합니다. Wikipedia에서 구문이 다음 형식을 따른다는 것을 읽었습니다.

(conditions) {actions}

BEGIN 및 END 블록에서 동일한 구문을 따를 수 있다고 가정합니다. 하지만 다음 스크립트를 실행하면 구문 오류가 발생합니다.

awk 'BEGIN{}
(1 == 1) {print "hello";}
END{
(1==1) {print "ended"}}' $1

그러나 END 블록 내부에서 일부 변경을 하고 조건 앞에 "if"를 추가하면 제대로 작동합니다.

awk 'BEGIN{}
(1 == 1) {print "hello";}
END{
if (1==1) {print "ended"}}' $1

왜 "if"를 END 블록에 써야 하지만 일반 블록에는 쓰지 말아야 합니까?

답변1

AWK 프로그램은 일련의 규칙이며 함수일 수도 있습니다. 규칙은 다음과 같이 정의됩니다.무늬( (conditions)귀하의 형식으로) 다음에행동;둘 다 선택 사항입니다.

BEGIN그리고 END특별한 패턴.

따라서

BEGIN {}
(1 == 1) { print "hello"; }
END { if (1 == 1) { print "ended" } }

패턴은 BEGIN, (1 == 1)(괄호는 필요하지 않음) 및 입니다 END.

패턴 뒤에 오는 중괄호 안의 블록(또는 모든 것과 일치하는 패턴 없음)은 다음과 같습니다.행동. 이런 패턴을 쓸 수는 없습니다~에각각을 도입한 패턴에 의해 제어되는 블록입니다. 작업 내의 조건은 if명령문(또는 기타 조건문 while등)의 일부로 지정되어야 합니다.

위의 액션은 {}(빈 액션), { print "hello"; }, 입니다 { if (1 == 1) { print "ended" } }.

다음으로 구성된 블록은 { (1 == 1) { print "ended" } }구문 오류를 발생시킵니다. 왜냐하면 (1 == 1)여기에 명령문이 있고 어떤 방식으로든 다음 명령문과 분리되어야 하기 때문입니다. { 1 == 1; { print "ended" } }유효하지만 원하는 효과를 얻을 수는 없습니다. 1 == 1평가된 후 별도로 { print "ended" }.

답변2

견적(영문)Wikipedia - AWK 프로그램의 구조

AWK 프로그램은 다음과 같이 작성된 일련의 패턴 작업 쌍입니다.

condition { action }
condition { action }
...

조건은 일반적으로 표현식이고 작업은 일련의 명령입니다.

기사에서 언급하지 않은 것은 조건이나 패턴이 선택 사항이라는 것입니다. 이는 (1 == 1)항상 사실이므로 귀하의 경우에는 필요하지 않음을 의미합니다 .


조각 생성 다시 작성

BEGIN {}
{ print "hello"; }
END { print "ended"; }

빈 작업을 사용하면 이 줄을 완전히 건너뛸 수 있습니다.

{ print "hello"; }
END { print "ended"; }

또한 예에서

END {(1 == 1) { print "ended"; }}

패턴/조건은 END이고 는 아닙니다 (1 == 1). 1 == 1그것은 행동 안에 있고 행동의 일부입니다. 이것이 오류의 원인이기도 합니다.

관련 정보