AWK 比较数组的索引

问题描述 投票:0回答:1

我有这个命令:

echo "29601 sc        20   0  608372  63680  46268 S  90.9  0.0   4168:30 vcs1" \
|awk '{time_=$(NF-1);  gsub(/:.*/, "", time_);  a[time_] = $0} END {for (i in a) { if(i < 50) {print i, "--------" ,a[i]}}}'

那么它的输出是:

4168 -------- 29601 sc        20   0  608372  63680  46268 S  90.9  0.0   4168:30 vcs1

我在该命令中的某些地方是否写错了?为什么

i=4168
小于
50
。 我希望当我输入
i > 50
时,命令输出将返回,而不是
i < 50

arrays awk gsub
1个回答
0
投票

gawk
“有效”,因为它不符合自己的规范:

$12 [vcs1] string
$11 [4168:30] string
$10 [0.0] strnum
$9 [90.9] strnum
$8 [S] string
$7 [46268] strnum
$6 [63680] strnum
$5 [608372] strnum
$4 [0] strnum
$3 [20] strnum
$2 [sc] string
$1 [29601] strnum

4168:30 string 1
4168 string string 29601 sc        20   0  608372  63680  46268 S  90.9  0.0   4168:30 vcs1
4168 string
4168 -------- 29601 sc        20   0  608372  63680  46268 S  90.9  0.0   4168:30 vcs1

数组索引

4168
始终是
string
类型 - 当它作为字段进入时,在
gsub()
之后,并制成数组索引。

gawk
自己的手册明确指出这种比较应该是字符串比较:

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

[https://www.gnu.org/software/gawk/manual/html_node/Variable-Typing.html][1]

© www.soinside.com 2019 - 2024. All rights reserved.