처리 과정은 다음과 같습니다.
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++;