【发布时间】:2018-07-27 13:11:42
【问题描述】:
我最近才开始使用 jq,我想知道这样的事情是否可行。
例子:
{
"name": "device",
"version": "1.0.0",
"address": [
{
"address": "10.1.2.3",
"interface": "wlan1_wifi"
},
{
"address": "10.1.2.5",
"interface": "wlan2_link"
},
{
"address": "10.1.2.4",
"interface": "ether1"
}
],
"wireless": [
{
"name": "wlan1_wifi",
"type": "5Ghz",
"ssid": "wifi"
},
{
"name": "wlan2_link",
"type": "2Ghz",
"ssid": "link"
}
]
}
首先让我们将示例转换为这个 json 对象:
cat json | jq '. | {"name": ."name", "version": ."version", "wireless": [."wireless"[] | {"name": ."name", "type": ."type", "ssid": ."ssid"}]}'
{
"name": "device",
"version": "1.0.0",
"wireless": [
{
"name": "wlan1_wifi",
"type": "5Ghz",
"ssid": "wifi"
},
{
"name": "wlan2_link",
"type": "2Ghz",
"ssid": "link"
}
]
}
现在有一个问题。我需要为"wireless" 数组分配一个地址。地址存储在"address"数组中。
所以问题是:有没有一种方法可以根据"name"(在无线阵列中)和“interface"(在地址阵列中)在"address" 中为@ 中的每个json 对象找到正确的json 对象987654330@ 数组,然后将"address" 分配给它?
最终的结果应该是这样的:
{
"name": "device",
"version": "1.0.0",
"wireless": [
{
"name": "wlan1_wifi",
"type": "5Ghz",
"ssid": "wifi",
"address": "10.1.2.3"
},
{
"name": "wlan2_link",
"type": "2Ghz",
"ssid": "link",
"address": "10.1.2.5"
}
]
}
答案:
这是我基于来自@peak 的answer 的答案。我不是复制.wireless 的内容然后使用map,而是挑选我只想包含的键。这也让我可以随意定位“地址”。
(INDEX(.address[]; .interface)) as $dict
| {name: .name, version: .version,
wireless: [.wireless[] | {name, address: ($dict[.name]|.address), type, ssid}]}
【问题讨论】:
-
请花时间创建一个小例子,而不是把一堆现实世界的数据放到问题中
-
Josef - 是的,这是可能的,但请参阅 minimal reproducible example。
-
对不起@hek2mgl,现在应该没问题了
-
酷!现在看起来好多了。