Jq
包含父鍵的 JQ 過濾數據
我有給定內容的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 ...
我怎樣才能做到這一點?
鑑於您顯示的 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
這將在文件的第 3 層迭代所有對象的“路徑”(即到 、 等結構的路徑
Lithium
)Sodium
為$p
。每個$p
都是一個數組,如["Metals","AlkaliMetals","Sodium"]
.:
它使用目前路徑通過將路徑與分隔符連接起來來創建每個輸出行的初始部分。使用getpath()
從目前路徑獲取實際沸騰和熔化溫度,並將值附加到字元串的末尾。這似乎也適用於您連結到的較大文件,但輸出
null
缺少的溫度數據。