【发布时间】:2011-09-29 04:46:55
【问题描述】:
我编写了一个 munin 插件,它使用 slurm 的 sacct 来监控 HPC 集群上的作业状态。我用 sh + awk 编写了它(而不是我通常选择的工具 perl)。
脚本有效,但我花了很长时间才弄清楚如何预填充可能状态的关联数组(一些/大多数可能不存在于 sacct 输出中,我希望它们默认为零)。 Google 帮不上什么忙,我能想到的最好办法是在字符串上使用 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 不提供直接用它的索引初始化数组的方法。这是 awk 和 perl 之间的哲学差异 - awk 故意保持其语言简洁,因此没有直接的方法来做与其他语言结构无关的事情,而 perl 为您提供了令人眼花缭乱的无数语言结构来简单地做事情(但不一定简明扼要)尽可能。 @DavidZaslavsky 为您提供了正确的 awk 答案,但我建议您考虑一个修改,我现在将发布一个单独的答案,因为它不适合评论。
标签: awk associative-array