使用 jq 从 json 中提取数据时将数组值写入同一行

writing array values to the same line while extracting data from json using jq

我有以下 json:

{
  "jsonrpc": "2.0",
  "result": [
    {
      "hostid": "15226",
      "host": "host1",
      "groups": [
        {
          "groupid": "56",
          "name": "Group 1",
          "internal": "0",
          "flags": "0"
        },
        {
          "groupid": "112",
          "name": "Group 2",
          "internal": "0",
          "flags": "0"
        }
      ]
    }
  ],
  "id": 1
}

我正在尝试从中提取值以使用 jq 创建此行:

15226, host1, Group 1, Group 2

我可以执行以下操作,但这不是我想要的:

jq -r '.result[] | .hostid + ", " + .host + ", " + .groups[].name' hostlist.json
15226, host1, Group 1
15226, host1, Group 2

无法理解,感谢任何帮助。

使用 reduce 似乎可以解决问题:.result[] | .hostid + ", " + .host + ", " + (reduce .groups[].name as $gn (""; . + $gn + " "))

您可能还想 trim 输出,因为这会产生额外的空白字符。

你可以使用这个:

jq -r '.result[]|[.hostid,.host,.groups[].name]|@csv'

输出:

"15226","host1","Group 1","Group 2"

@csv 从中生成正确的 csv。如果你不喜欢这样,一个简单的 join(',') 就足够了:

jq -r '.result[]|[.hostid,.host,.groups[].name]|join(",")'

输出:

15226,host1,Group 1,Group 2

join / @csvhek2mgl 所述绝对是最简单的方法。

作为参考,这是一个使用字符串插值构建行的初始部分并reduce向其添加组名的版本:

  .result[]
| reduce .groups[].name as $g (
      "\(.hostid), \(.host)"
    ; . + ", " + $g 
  )