json - 用 jq 重构 JSON
问题描述
我有一个这样的 JSON (sample.json):
{
"sheet1": [
{
"hostname": "sv001",
"role": "web",
"ip1": "172.17.0.3"
},
{
"hostname": "sv002",
"role": "web",
"ip1": "172.17.0.4"
},
{
"hostname": "sv003",
"role": "db",
"ip1": "172.17.0.5",
"ip2": "172.18.0.5"
}
],
"sheet2": [
{
"hostname": "sv004",
"role": "web",
"ip1": "172.17.0.6"
},
{
"hostname": "sv005",
"role": "db",
"ip1": "172.17.0.7"
},
{
"hostname": "vsv006",
"role": "db",
"ip1": "172.17.0.8"
}
],
"sheet3": []
}
我想提取这样的数据:
表 1
jq '(某事命令)' sample.json
{
"web": {
"hosts": [
"172.17.0.3",
"172.17.0.4"
]
},
"db": {
"hosts": [
"172.17.0.5"
]
}
}
是否可以使用 jq map 进行重建?(我会将结果重用于 ansible 库存。)
解决方案
这是一个简短、直接且高效的解决方案——高效的部分原因是它group_by
通过以下通用辅助函数避免了:
def add_by(f;g): reduce .[] as $x ({}; .[$x|f] += [$x|g]);
.sheet1
| add_by(.role; .ip1)
| map_values( {hosts: .} )
输出
这会产生所需的输出:
{
"web": {
"hosts": [
"172.17.0.3",
"172.17.0.4"
]
},
"db": {
"hosts": [
"172.17.0.5"
]
}
}
推荐阅读
- django - 如何从共享当前位置的 Google Maps url 以编程方式获取坐标?
- ios - 以编程方式添加 UIView 和 UITableView
- c# - 在 WPF 文本框中,为什么滚动时不活动的选择显示不正确?
- mongodb - MongoDB聚合查询组并计数
- c# - Unity - 构建相机与编辑器的“游戏”相机不同
- google-app-engine - 应如何从 App Engine 添加 Firebase 自定义声明?
- python - 如何将函数或表达式作为参数传递?
- java - 开箱即用 - WebService - DB - 网页/移动访问
- c# - xUnit Assert.Throws 和 Record.Exception 不捕获异常
- amazon-web-services - 使用 SAM 创建 API 密钥和使用计划