![JQ 使用包含的父键过滤数据](https://linux22.com/image/161590/JQ%20%E4%BD%BF%E7%94%A8%E5%8C%85%E5%90%AB%E7%9A%84%E7%88%B6%E9%94%AE%E8%BF%87%E6%BB%A4%E6%95%B0%E6%8D%AE.png)
我有给定内容的 json:
{
"Metals": {
"AlkaliMetals": {
"Lithium": {
"MeltingPoint": "453",
"BoilingPoint": "1615"
},
"Sodium": {
"MeltingPoint": "371",
"BoilingPoint": "1156"
}
},
"AlkalineEarthMetals": {
"Beryllium": {
"MeltingPoint": "1560",
"BoilingPoint": "2743"
},
"Magnesium": {
"MeltingPoint": "923",
"BoilingPoint": "1363"
}
}
},
"Metalloids": {
"Metaloids": {
"Boron": {
"MeltingPoint": "2348",
"BoilingPoint": "4273"
},
"Silicon": {
"MeltingPoint": "1687",
"BoilingPoint": "3173"
}
}
}
}
目前我使用以下命令生成输出:
jq -r -S '.[][] | keys[] as $k | "\($k):\(.[$k] | .MeltingPoint):\(.[$k] | .BoilingPoint)"' elements.json
这给了我:
Lithium:453:1615 ...
我想将此扩展为也有父密钥:
AlkaliMetals:Lithium:453:1615 ...
或所有键:
Metals:AlkaliMetals:Lithium:453:1615 ...
我怎样才能做到这一点?
答案1
鉴于您显示的 JSON 文档:
$ jq -r 'path(.[][][]) as $p | "\($p|join(":")):\(getpath($p).MeltingPoint):\(getpath($p).BoilingPoint)"' file.json
Metals:AlkaliMetals:Lithium:453:1615
Metals:AlkaliMetals:Sodium:371:1156
Metals:AlkalineEarthMetals:Beryllium:1560:2743
Metals:AlkalineEarthMetals:Magnesium:923:1363
Metalloids:Metaloids:Boron:2348:4273
Metalloids:Metaloids:Silicon:1687:3173
Lithium
这将文档第 3 层的所有对象的“路径”(即、等结构的路径Sodium
)迭代为$p
。每个$p
都是一个类似的数组["Metals","AlkaliMetals","Sodium"]
。它使用当前路径通过将路径与:
分隔符连接起来来创建每个输出行的初始部分。实际的沸腾和熔化温度是从当前路径获取的getpath()
,并将值附加到字符串的末尾。
这似乎也适用于您链接到的较大文件,但输出null
缺少温度数据。