`!a[$0]++`의 awk 연산자 우선순위

`!a[$0]++`의 awk 연산자 우선순위

awk 표현이 있는데 !a[$0]++정확한 평가 순서를 알고 싶습니다. awk의 문서에 따르면 ++의 우선순위는 보다 높습니다 !. 그러나 이 예에서 ++접미사 형태는 yes( !++a[$0]내가 이해한 바에 따르면 아님)는 기본적으로 awk에게 "다른 부분을 먼저 평가한 다음 나를 평가하라"고 지시합니다. 이 경우 , 평가 순서는 어떻게 되나요?

답변1

여기(*)가 가장 높은 우선순위를 갖는다는 데 동의할 수 있으므로 a[$0]로 단순화할 수 있습니다 x.

나는 당신이 읽은 내용이 정확하다고 말하고 싶습니다 . ++다음보다 우선 순위가 높습니다 !.

$ awk 'BEGIN{ x=123; tmp = !x++;  print tmp, x; }'
0 124
$ awk 'BEGIN{ x=123; tmp = !(x++);  print tmp, x; }'
0 124

물론. !x++값을 가져와 x반환한 다음 값을 증가시킵니다. 반환 값은 123부정되고 생성됩니다 0. 증가된 값은 나중에 에서 확인할 수 있습니다 x.

!하지만 더 밀접하게 통합된 또 다른 가능성도 시도해 보겠습니다 .

$ awk 'BEGIN{ x=123; tmp = (!x)++;  print tmp, x; }'
awk: cmd. line:1: BEGIN{ x=123; tmp = (!x)++;  print tmp, x; }
awk: cmd. line:1:                           ^ syntax error

음, 이런. 이제 이 !값은 먼저 값을 가져온 x다음 이를 반전하고 반환하기 때문에 작동하지 않습니다 0. 이제 좀 늘려야지 ++,결과를 다시 저장. 하지만 0변수가 아닌 값일 뿐이며 저장할 수 없습니다. 따라서 오류가 발생했습니다. (비슷한 경우 (1+2)++동일한 오류가 발생합니다.)

따라서 ++우선순위가 높을수록 반환되는 값에서 명확하지 않은 숨겨진 부작용이 있습니다.

(* 구독 사업자는 표시되지 않습니다.우선 순위 테이블표준에서는C 연산자 우선순위 테이블, 그러나 우선순위가 낮은 경우에는 표현식이 실제로 작동하지 않습니다. )

답변2

데모:

$ cat file
1 a
2 b
1 c
2 d
3 e
$ awk '!a[$1]++' file
1 a
2 b
3 e

++먼저 발생합니다. 사후 증분이므로 첫 번째 줄의 경우 a[$1]++a[1]의 값을 증가시키지만 0을 반환하고 부정은 이를 true로 바꾼 다음 첫 번째 줄을 인쇄합니다. 2호선과 동일합니다. 세 번째 줄의 경우 a[1]에는 이미 값 1이 있고 사후 증분은 값을 2로 설정하고 1을 반환하므로 false가 무효화됩니다.


mawk 매뉴얼 페이지가 더 명확해졌습니다.

   New expressions are composed with the following operators in order of increasing
   precedence.

        assignment          =  +=  -=  *=  /=  %=  ^=
        conditional         ?  :
        logical or          ||
        logical and         &&
        array membership    in
        matching       ~   !~
        relational          <  >   <=  >=  ==  !=
        concatenation       (no explicit operator)
        add ops             +  -
        mul ops             *  /  %
        unary               +  -
        logical not         !
        exponentiation      ^
        inc and dec         ++ -- (both post and pre)
        field               $

관련 정보