使用' jq '将键/值添加到使用另一个json文件作为源的json文件



一直在努力解决这个问题,我没有接近解决方案。我不是很有经验使用jq

我想从一个json文件中获取值,并在字典中的其他值匹配时将它们添加到另一个文件中。下面的示例文件比解释更清楚地演示了我想要的内容。

hosts.json:

{
"hosts": [
{
"host": "hosta.example.com",
"hostid": "101",
"proxy_hostid": "1"
},
{
"host": "hostb.example.com",
"hostid": "102",
"proxy_hostid": "1"
},
{
"host": "hostc.example.com",
"hostid": "103",
"proxy_hostid": "2"
}
]
}

proxies.json:

{
"proxies": [
{
"host": "proxy1.example.com",
"proxyid": "1"
},
{
"host": "proxy2.example.com",
"proxyid": "2"
}
]
}

我也有上面的文件,proxyid作为关键字,如果这使它更容易:

{
"proxies": {
"1": {
"host": "proxy1.example.com",
"proxyid": "1"
},
"2": {
"host": "proxy2.example.com",
"proxyid": "2"
}
}
}

使用上面的这些json文件(来自Zabbix API),我想将.proxies[].host的值(从proxies.json)添加为.hosts[].proxy_host(到hosts.json)。

只有当.hosts[].proxy_hostid=.proxies[].proxyid

所需输出:

{
"hosts": [
{
"host": "hosta.example.com",
"hostid": "101",
"proxy_hostid": "1",
"proxy_host": "proxy1.example.com"
},
{
"host": "hostb.example.com",
"hostid": "102",
"proxy_hostid": "1",
"proxy_host": "proxy1.example.com"
},
{
"host": "hostc.example.com",
"hostid": "103",
"proxy_hostid": "2",
"proxy_host": "proxy2.example.com"
}
]
}

我已经尝试了很多不同的方法来做到这一点,并认为我需要使用jq -sjq --slurpfile,但我已经达到了很多死胡同,找不到解决方案。

jq 'input as $p | map(.[].proxy_host = $p.proxies[].proxyid)' hosts.json proxies.json

我想我也需要这样的东西,但不知道如何使用。

if .hosts[].proxy_hostid == .proxies[].proxyid then .hosts[].proxy_host = .proxies[].host else empty end'

我发现了这些问题,但它们没有帮助:(

  • 如何在jq中使用值作为键引用?<-我认为这是最接近的
  • 从一个JSON文件中查找值并替换为另一个
  • 使用jq查找基于另一个键/值对的键/值对

使用proxies.json的替代版本确实更容易。您所需要的只是将代理存储在一个变量中作为引用,并在更新主机时从中检索代理主机。

jq 'input as { $proxies } | .hosts[] |= . + { proxy_host: $proxies[.proxy_hostid].host }' hosts.json proxies.json
<<p><一口>在线演示/一口>

最新更新