awk 如何比较数字(“40”)和包含数字和其他字符的字符串(“203-344-1234”)?

awk 如何比较数字(“40”)和包含数字和其他字符的字符串(“203-344-1234”)?

我有一个文本文件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') 进行比较。


什么是比较类型

[GNU awk] 字符串类型与数字类型

当比较两个操作数时,可以使用字符串比较或数字比较。根据以下对称矩阵,这取决于操作数的属性:

    +---------------------------------------------------------
    |                 STRING          NUMERIC         STRNUM
    +---------------------------------------------------------
    | STRING  |       string          string          string
    | NUMERIC |       string          numeric         numeric
    | STRNUM  |       string          numeric         numeric
    +---------------------------------------------------------

数字如何转换为字符串

[GNU awk] 比较运算符

比较混合类型的操作数时,数字操作数将使用 的值转换为字符串CONVFMT(请参阅 字符串和数字的转换)。

通过上面的链接,我们可以看到如何将数字转换为字符串以进行比较。通过调用创建一个字符串,sprintf()并使用 awk 预定义变量CONVFMT进行格式化,默认为"%.6g",它最多保留 6 位小数有效数字。但对于整数:

作为一种特殊情况,如果数字是整数,那么将其转换为字符串的结果始终是整数,无论​​ 的值是什么CONVFMT

对于本例,$4is203-344-1234是一个字符串,而不是数字。第二个参数是一个数字,转换为字符串'40'(无论CONVFMT值是什么,因为它是一个整数)。


如何强制字符串或数字

来自同一页面的一些附加信息:

如果出于某种原因,您需要强制将数字转换为字符串,请将该数字与空字符串 串联起来""。要强制将字符串转换为数字,请向该字符串添加零

有时,为了确保字段将用作数字,我们将其写为$1+0.例如,在这种情况下,如果我们强制$4+0它将是前三位数字的整数203(就是这样,尝试创建一个以第一个非数字字符结束的数字)。

相关内容