처리 과정은 다음과 같습니다.
a[$0]
: $0
연관 배열에서 키 값을보십시오 a
. 존재하지 않는 경우 작성하십시오.
a[$0]++
:의 값을 늘리고 a[$0]
이전 값을 expression의 값으로 반환합니다. 경우 a[$0]
, 존재 반환하지 않습니다 0
및 증가 a[$0]
에 1
( ++
운영자 반환 숫자 값).
!a[$0]++
: 표현의 가치를 부정합니다. 경우 a[$0]++
반환 0
, 전체 표현식이 true로 평가, 메이크업은 awk
기본 작업을 수행 한 print $0
. 그렇지 않으면 전체 표현식이 false로 평가되어 awk
아무 것도 수행하지 않습니다.
참고 문헌 :
함께 gawk
, 우리는 사용할 수 있습니다 (또는 dgawk awk --debug
최신 버전) 디버그하는 gawk
스크립트를. 먼저 다음과 같은 gawk
스크립트를 작성하십시오 test.awk
.
BEGIN {
a = 0;
!a++;
}
그런 다음 다음을 실행하십시오.
dgawk -f test.awk
또는:
gawk --debug -f test.awk
디버거 콘솔에서 :
$ dgawk -f test.awk
dgawk> trace on
dgawk> watch a
Watchpoint 1: a
dgawk> run
Starting program:
[ 1:0x7fe59154cfe0] Op_rule : [in_rule = BEGIN] [source_file = test.awk]
[ 2:0x7fe59154bf80] Op_push_i : 0 [PERM|NUMCUR|NUMBER]
[ 2:0x7fe59154bf20] Op_store_var : a [do_reference = FALSE]
[ 3:0x7fe59154bf60] Op_push_lhs : a [do_reference = TRUE]
Stopping in BEGIN ...
Watchpoint 1: a
Old value: untyped variable
New value: 0
main() at `test.awk':3
3 !a++;
dgawk> step
[ 3:0x7fe59154bfc0] Op_postincrement :
[ 3:0x7fe59154bf40] Op_not :
Watchpoint 1: a
Old value: 0
New value: 1
main() at `test.awk':3
3 !a++;
dgawk>
당신은 Op_postincrement
전에 실행 된 것을 볼 수 있습니다 Op_not
.
다음을 사용 si
하거나 stepi
대신 s
또는 step
보다 명확하게 볼 수도 있습니다 .
dgawk> si
[ 3:0x7ff061ac1fc0] Op_postincrement :
3 !a++;
dgawk> si
[ 3:0x7ff061ac1f40] Op_not :
Watchpoint 1: a
Old value: 0
New value: 1
main() at `test.awk':3
3 !a++;