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″差在哪?

我来说说

(便于我们更好的交流)

有不明白的地方欢迎留言哦~
取消