使用 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 / @csv 如 hek2mgl 所述绝对是最简单的方法。
作为参考,这是一个使用字符串插值构建行的初始部分并reduce向其添加组名的版本:
.result[]
| reduce .groups[].name as $g (
"\(.hostid), \(.host)"
; . + ", " + $g
)
我有以下 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 / @csv 如 hek2mgl 所述绝对是最简单的方法。
作为参考,这是一个使用字符串插值构建行的初始部分并reduce向其添加组名的版本:
.result[]
| reduce .groups[].name as $g (
"\(.hostid), \(.host)"
; . + ", " + $g
)