我有以下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
无法弄明白,任何帮助都表示赞赏。
答案 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)
加入 / @csv 绝对是最简单的方法。
作为参考,这里有一个版本,它使用字符串插值来构建行的初始部分, reduce 以向其添加组名称:
.result[]
| reduce .groups[].name as $g (
"\(.hostid), \(.host)"
; . + ", " + $g
)