awk 判断 true 和 false 的条件

awk 判断 true 和 false 的条件

我发现如果我们使用awk 0 inputfile,它不会打印任何内容,因为0条件为假。

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

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

但是如果我们使用awk any_integer inputfile,它会变为 true 并打印文件的每一行,我可以知道原因是什么吗?

我找不到这已在GNUawk手册尽管。

答案1

真的for awk 要么是非空细绳或非零数字(数字为十进制整数或浮点数,并且某些 awk 实现也支持十六进制或八进制)。用双引号括起来的东西是字符串,不带引号的文字数字是数字,但对于其他任何东西,都有复杂的规则来确定某些东西是否被视为字符串或数字。 GNUawk手册有整整一章的内容

真的:

  • 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'

嗯嗯:

  • 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 {print $1, "不为空"}'

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

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

相关内容