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

时间:2015-11-25 14:55:45

标签: json 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

无法弄明白,任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:3)

您可以使用:

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

答案 1 :(得分:2)

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

您可能还希望修剪输出,因为这会产生额外的空白字符。

答案 2 :(得分:0)

hek2mgl描述的

加入 / @csv 绝对是最简单的方法。

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

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