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

在awk中预先填充关联数组键?,第1张

概述我写了一个munin插件,它使用slurm的sacct来监视HPC集群上的作业状态.我用sh awk写了它(而不是我常用的工具,perl). 该脚本有效,但我花了很多时间才弄清楚如何预先填充可能状态的关联数组(一些/大多数可能不存在于sacct输出中,我希望它们默认为零).谷歌没有多大帮助,我能想到的最好的就是在字符串上使用split来生成一个临时数组,然后我迭代了. 我想出了这个: BEGIN 我写了一个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和CANCELLED – 其他状态不存在(因为它们今天没有出现),但我仍然希望它们在我的脚本输出中(以munin可用的形式表示为“ statename.value 0“).

# sacct -X -P -o 'state' -nRUNNINGRUNNINGRUNNINGRUNNINGCOMPLETEDRUNNINGCOMPLETEDRUNNINGCOMPLETEDCOMPLETEDCANCELLED by 1000COMPLETED

[再次编辑]

这是我的munin插件的示例输出:

# ./slurm-sacctsuspended.value 0pending.value 0nodefail.value 0Failed.value 0running.value 6completing.value 0completed.value 5timeout.value 0cancelled.value 1

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

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

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

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

每次执行表达式[$1]时,它将检查状态[$1]是否存在,如果它尚不存在则将其初始化为0.

编辑:从你的评论我猜你想打印出每个可能状态的一行,无论该状态是否有任何工作.在这种情况下,您需要包含所有可能的状态名称,并且没有像Perl中那样执行此 *** 作的快捷方式.据我所知,你已经发现的东西是干净利落的. (Awk并没有真正考虑到这种用法)

我建议如下:

{ states[]++ }END {     split("cancelled completed completing Failed nodefail pending running suspended timeout"," ");     for (state in statenames) print state,states[state]+0}
总结

以上是内存溢出为你收集整理的在awk中预先填充关联数组键?全部内容,希望文章能够帮你解决在awk中预先填充关联数组键?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1027825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存