![AWK의 END 블록에 "if"를 쓰지 않으면 구문 오류가 발생하는 이유는 무엇입니까?](https://linux55.com/image/188597/AWK%EC%9D%98%20END%20%EB%B8%94%EB%A1%9D%EC%97%90%20%22if%22%EB%A5%BC%20%EC%93%B0%EC%A7%80%20%EC%95%8A%EC%9C%BC%EB%A9%B4%20%EA%B5%AC%EB%AC%B8%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
요즘에는 텍스트 처리를 위해 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
그것은 행동 안에 있고 행동의 일부입니다. 이것이 오류의 원인이기도 합니다.