awk - 在 awk 中预填充关联数组键?

标签 awk associative-array

我编写了一个 munin 插件,它使用 slurm 的 sacct 来监视 HPC 集群上的作业状态。我已经用 sh + awk(而不是我通常选择的工具 perl)编写了它。

该脚本有效,但我花了很长时间才弄清楚如何预先填充可能状态的关联数组(一些/大多数可能不存在于 sacct 输出中,我希望它们默认为零)。谷歌没有太大帮助,我能想到的最好方法是对字符串使用 split 来生成一个临时数组,然后我对其进行迭代。

我想出了这个:

BEGIN {
    num = split("cancelled completed completing failed nodefail pending running suspended timeout",statenames," ");
    for (i=1;i<=num;i++) {
        states[statenames[i]] = 0
    }
  }

这有效,但与我在 perl 中的做法相比似乎很笨拙,如下所示:
foreach (qw(cancelled completed completing failed nodefail pending running suspended timeout)) {
    $states{$_} = 0;
}

或这个
%states = map {$_ => 0} qw(cancelled completed completing failed nodefail pending running suspended timeout);

我的问题是:在 awk 中是否有一种类似于 perl 版本的方法?

[编辑]

澄清一下,这是我正在输入 awk 的 sacct 输出示例。请注意,此输出中的唯一状态是 RUNNING、COMPLETED 和 CANCELED - 其他状态不存在(因为它们今天没有发生),但无论如何我都希望它们出现在我的脚本输出中(以 munin 可用的形式作为“statename.value 0")。
# sacct -X -P -o 'state' -n
RUNNING
RUNNING
RUNNING
RUNNING
COMPLETED
RUNNING
COMPLETED
RUNNING
COMPLETED
COMPLETED
CANCELLED by 1000
COMPLETED

[再次编辑]

这是我的 munin 插件的示例输出:
# ./slurm-sacct
suspended.value 0
pending.value 0
nodefail.value 0
failed.value 0
running.value 6
completing.value 0
completed.value 5
timeout.value 0
cancelled.value 1

该脚本运行并执行我想要的操作,我只是想知道是否有更好的方法来初始化关联数组。

最佳答案

您可能根本不需要这样做。 awk 中的变量是动态的,这意味着它们在第一次使用(分配给或访问)时会自动初始化,这也适用于数组元素。

如果在数字上下文中访问变量,则变量将被初始化为 0,否则将被初始化为空字符串。 (至少 gawk 是这样做的,虽然我不确定它是否依赖于实现)所以如果你正在做一些事情,比如计算每个状态下的作业数量,整个程序就像这样简单

{ states[$1]++ }
END {
     for (state in states) print state, states[state]
}

每次表达states[$1]++执行时,它会检查 states[$1] 是否存在如果它不存在,则将其初始化为 0。

编辑:根据您的评论,我猜您想为每个可能的状态打印一行,无论该状态是否有任何作业。在这种情况下,您需要包括所有可能的状态名称,并且没有像 Perl 那样这样做的快捷符号。据我所知,你已经发现的东西已经很干净了。 (Awk 并没有真正考虑到这种用法)

我建议如下:
{ states[$1]++ }
END {
     split("cancelled completed completing failed nodefail pending running suspended timeout",statenames," ");
     for (state in statenames) print state, states[state]+0
}

关于awk - 在 awk 中预填充关联数组键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592549/

相关文章:

unix - 如何使用命令行合并多个文本文件?

javascript/jquery - 向实例化对象添加属性

Javascript:以时间戳为键的数组

php - 多维数组将每个列表数组存储在另一个数组中

bash - 如何使用 awk 按列合并两个文件?

awk - 如何删除一个空行和仅当它不为空时的下一行

bash - 搜索字段并显示下一个数据

linux - 使用 Grep 或 AWK 命令

php - 获取数组的第一个值

multidimensional-array - 系统验证 : associative array of dynamic arrays