kris@letuknowit:~$ awk 'BEGIN{if(0) print "true";else print "false"}' false kris@letuknowit:~$ awk 'BEGIN{if("0") print "true";else print "false"}' true
为什么同样是 0 ,结果却不一样?
其实要解释这个问题,只需要弄清楚awk中的“真”与“假”。
在awk中,以下3种情况是“假”,其他情况都为“真”
1) 数字 0 2) 空字符串 3) 未定义的值
下面通过几个例子演示下
kris@letuknowit:~$ awk 'BEGIN{a=0;if(a) print "true";else print "false"}' false kris@letuknowit:~$ awk 'BEGIN{a="";if(a) print "true";else print "false"}' false kris@letuknowit:~$ awk 'BEGIN{if(a) print "true";else print "false"}' false
来看一个被大家称为月经的问题,awk如何去重?示例请参考《awk去除重复行》
awk '! a[$0] ++'
在解释之前,我们先要了解awk的一个特性:awk 会根据语境来给未定义的变量赋初始值
kris@letuknowit:~$ awk 'BEGIN{print a "" 1}' 1 kris@letuknowit:~$ awk 'BEGIN{print a + 1}' 1
对于未定义的变量,如果要进行字符串操作,会被赋成空字符串 “”;如果要进行数学运算,会被赋成数字 0。
现在我们看看上面的代码:
! a[$0] ++ 等价于 if(! a[$0] ++) print $0
对于首次出现的记录,a[$0]的值是未定义的,由于后面的 ++ 是数学计算,所以a[$0]会被赋值成数字0
也是由于 ++ 操作符,会先取值,再计算,所以对于第一行记录实际上是if(! 0) print $0
! 是取反,0 是假,! 0 就是真,那么就会执行后面的 print $0
对于后面出现的重复记录,a[$0] 经过 ++ 的计算已经变为 1、2、3 。。。
而 ! 1 ! 2 ! 3 … 都为假,不会打印。
下面用awk打印奇数行的代码能够让你更深刻的替换awk的上述特性:
kris@letuknowit:~$ seq 10 | awk 'i=!i' 1 3 5 7 9
转载请注明:知识蚂蚁 » awk基础知识:0和”0″差在哪?