我发现如果我们使用awk 0 inputfile
,它不会打印任何内容,因为0
条件为假。
如果我们使用awk 1 inputfile
,它会将1
awk 解释的每一行的所有内容打印为 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
是 和 的串联0
,x1
产生的变量"0"
被转换为数字(0),如果减去,1
则得到-1
非零数字)。
这意味着如果你想检查字符串是否非空,你不应该这样做:
awk '$1 {print $1, "不为空"}'
但
awk '$1 != "" {print $1, "is not empty"}'
否则它不会说0
或非-0000E+00001234
空。