使用jq将非统一的JSON输出转换为汇总表

zujrkrfu  于 2023-05-13  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在尝试将作业数据从LSF作业调度程序转换为主机和状态的汇总表。例如,这可能是一些示例数据:

$ bjobs -q normal -a -uall -o 'exec_host stat' -json
{
  "COMMAND":"bjobs",
  "JOBS":5,
  "RECORDS":[
    {
      "EXEC_HOST":"compute-node-1",
      "STAT":"RUN"
    },
    {
      "EXEC_HOST":"compute-node-1",
      "STAT":"DONE"
    },
    {
      "EXEC_HOST":"compute-node-2",
      "STAT":"RUN"
    },
    {
      "EXEC_HOST":"compute-node-1",
      "STAT":"EXIT"
    },
    {
      "EXEC_HOST":"compute-node-2",
      "STAT":"RUN"
    },

我想要的输出如下所示:

RUN   DONE   EXIT
compute-node-1   1     1      1
compute-node-2   2

我可以使用datamash通过一些非常笨拙的扭曲来实现这一点,但是将工作流最小化到bjobsjq将显著提高可维护性。我正在努力想出一个方法来总结唯一的EXEC_HOST/STAT值。
jq中是否有一种方法可以如上所述总结这些数据?

oaxa6hgo

oaxa6hgo1#

使用您的输入,以下调用将生成TSV输出,如下所示:

jq -r '
  .RECORDS 
  | (map(.STAT) | unique) as $statuses
  | reduce .[] as $x (null; .[$x.EXEC_HOST][$x.STAT] += 1)
  | [null, $statuses[]],
     (to_entries[] | [.key, .value[$statuses[]]])
  | @tsv
DONE    EXIT    RUN
compute-node-1  1   1   1
compute-node-2          2

你可以很容易地调整上面的,例如。如果你想更多的控制列的顺序。此外,您可能希望使用@csv而不是@tsv等。

相关问题