我有一个文本文件employees
:
Chen Cho 5/19/63 203-344-1234 $76
Tom Billy 4/12/45 913-972-4536 $102
Larry White 11/2/54 908-657-2389 $54
Bill Clinton 1/14/60 654-576-4114 $201
Steve Ann 9/15/71 202-545-8899 $58
当我这样做时awk '$4 < 40' employees
,我得到:
203-344-1234
202-545-8899
它给出相同的输出,直到< 65
我比较时$4 < 66
,我得到:
203-344-1234
654-576-4114
202-545-8899
我对 的这种行为感到困惑awk
。看起来它只是比较字段的前两位数字,而不是抛出一些错误,说明无法进行比较或其他操作。
awk
我的问题是:在这种情况下比较/行为如何?谢谢。
答案1
简而言之,这是 GNU 的字母顺序比较awk
。
因为我们将字符串 ( '203-344-1234'
) 与数字 ( '40'
) 进行比较。
什么是比较类型
当比较两个操作数时,可以使用字符串比较或数字比较。根据以下对称矩阵,这取决于操作数的属性:
+--------------------------------------------------------- | STRING NUMERIC STRNUM +--------------------------------------------------------- | STRING | string string string | NUMERIC | string numeric numeric | STRNUM | string numeric numeric +---------------------------------------------------------
数字如何转换为字符串
比较混合类型的操作数时,数字操作数将使用 的值转换为字符串
CONVFMT
(请参阅 字符串和数字的转换)。
通过上面的链接,我们可以看到如何将数字转换为字符串以进行比较。通过调用创建一个字符串,sprintf()
并使用 awk 预定义变量CONVFMT
进行格式化,默认为"%.6g"
,它最多保留 6 位小数有效数字。但对于整数:
作为一种特殊情况,如果数字是整数,那么将其转换为字符串的结果始终是整数,无论 的值是什么
CONVFMT
。
对于本例,$4
is203-344-1234
是一个字符串,而不是数字。第二个参数是一个数字,转换为字符串'40'
(无论CONVFMT
值是什么,因为它是一个整数)。
如何强制字符串或数字
来自同一页面的一些附加信息:
如果出于某种原因,您需要强制将数字转换为字符串,请将该数字与空字符串 串联起来
""
。要强制将字符串转换为数字,请向该字符串添加零
有时,为了确保字段将用作数字,我们将其写为$1+0
.例如,在这种情况下,如果我们强制$4+0
它将是前三位数字的整数203
(就是这样,尝试创建一个以第一个非数字字符结束的数字)。