AWK一个小小问题

AWK一个小小问题

看到一个帖子上面能用
awk ' !a[$1] ++ { printf "%s", $1 }; {print "\t",$2,$3}'
命令使
TUDOU01  1986  79
TUDOU01  1986  84
XXX1      1985   43
XXX1      1985    52
YYY1      1985   59
YYY1      1953  32
输出成
TUDOU01  1986 79
         1986 84
XXX1     1985 43
         1985 52
YYY1     1985 59
         1953 32
觉得这个很好用,就是不明白
!a[$1] ++ { printf "%s", $1 } 这个是上面意思特别是!a[$1] ++这个查了很多都不明白怎么回事?麻烦详细解答下!谢谢!      
a是一个数组 (hash)
a[$1]++ 要这么理解 ( a[$1] ) ++
只要 (a[$1)++过后, 以$1为key的value肯定就是非零 (这时, 当前行的$1就被在数组中记录在案了)

! 是取反,
取反后, 就出现要么是零,要么是非零的结果, 也就是真或假

理解的关键在于, 结合的顺序      
引用:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=17659 $?=0] ; cat file
TUDOU01  1986  79
TUDOU01  1986  84
XXX1     1985  43
XXX1     1985  52
YYY1     1985  59
YYY1     1953  32
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=17659 $?=0] ; awk '0==a[$1] {a[$1]++; printf "%s",$1}; {print "\t",$2,$3}' file
TUDOU01  1986 79
         1986 84
XXX1     1985 43
         1985 52
YYY1     1985 59
         1953 32
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=17659 $?=0] ; bye
      
0==a[$1]
这种写法都推广到shell了      
shell里的这种数组的用法我一直都很迷糊,好像和C的区别很大。哪位大哥有这方面的文档不?发出来我学学!谢谢!      
这是awk中的数组,功能类似hash.使用数字,字符串做下标。
有一本effective awk programming.. 不知名字记错没。
关于数组的引用可以参考下面的帖子:
http://www.chinaunix.net/index.p ... ead.php?tid=1308418      
谢谢!先看看!