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 $