真假条件


9

我发现,如果使用awk 0 inputfile,它将不会打印任何内容,原因0是错误的条件。

如果使用awk 1 inputfile,它将1为awk解释的每一行打印所有内容,均表示为true。

如果使用awk any_string inputfile,它将不会打印任何内容,因为所有awk变量都初始化为零,因此为false。

但是,如果使用awk any_integer inputfile,它将变为true并打印文件的每一行,请问是什么原因?

我找不到GNU awk手册中已经解释过的内容。


3
通过any_integer我猜你喜欢平均字面数量7, 89等。如果是这样,原因是比任何其他一些0手段true的条件
森迪普•

Answers:


13

对于awk,True是非空字符串或非零数字(数字是十进制整数或浮点数,并且在某些awk实现中也支持十六进制或八进制)。用双引号括起来的东西是字符串,不带引号的文字数字是数字,但是对于其他任何东西,都有复杂的规则来确定将某事物视为字符串还是数字。GNU awk手册中有一整章

真正:

  • awk '1' (非零数字)
  • awk '1e8' (非零数字)
  • awk '-0.01' (非零数字)
  • awk '"foo"' (非空字符串)
  • awk '"0"' (非空字符串)
  • awk '0 ""' (串联产生的字符串在这里非空)
  • echo 0 | awk '$1 ""' (与$ n字段相同)
  • awk 'substr("000", 1, 1)'(结果substr()始终是一个字符串)
  • echo '0foo' | awk '$0' ($ 0是非数字字符串,因此被视为字符串(非空))

假:

  • awk '0' (0号)
  • awk '""' (空字符串)
  • echo 0000e123 | awk '$1' (如果$ 1是一个数字字符串,并且在此处为0,则它​​被认为是数字)
  • echo ' 0 ' | awk '$0' (忽略前导和尾随空格以确定字符串是否为数字)。
  • awk '" 2foo" - 2' (算术表达式中涉及的字符串将转换为数字,且忽略该数字的任何内容)
  • awk 'unset_or_empty_variable' (空字符串)
  • awk '"non-numerical-string" + 0'

YMMV:

  • awk '1e-500' (有些人会抱怨,有些人会将其视为0)
  • awk '"0x1" + 0'(不是所有的awk实现支持的十六进制数,对那些确实"0x1"被转化为1,在别人0。有些版本的POSIX规范的不经意间需要实现来支持十六进制数那里,它被后来收回。不过gawk确实,当认识到十六进制数POSIXLY_CORRECT是环境)
  • awk '010 - 8' (与八进制数相同(与从字符串转换成的字符相反,此处的010与文字不同)
  • awk '0x1 - 1'(在awk不支持十六进制数字的实现中,0x1是的串联0x1产生的变量将"0"转换为数字(0)(如果减去则1得出的-1是非零数字))。

这意味着如果要检查字符串是否为非空,则不应执行以下操作:

awk'$ 1 {打印$ 1,“不为空”}}'

awk '$1 != "" {print $1, "is not empty"}'

否则,它不会说0-0000E+00001234有非空。


令人印象深刻且详细的答案!但是有一个问题:在您给出的最后一个示例中,我确实尝试了语法,第一个确实起作用了,它跳过了$ 1这是空的,只打印那些$ 1非空的行,因为如果$ 1是空字符串,它将是错误,因此不打印输出,不是吗?
sylye '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.