Jq

包含父鍵的 JQ 過濾數據

  • October 2, 2019

我有給定內容的json:

元素.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 層迭代所有對象的“路徑”(即到 、 等結構的路徑LithiumSodium$p。每個$p都是一個數組,如["Metals","AlkaliMetals","Sodium"]. :它使用目前路徑通過將路徑與分隔符連接起來來創建每個輸出行的初始部分。使用getpath()從目前路徑獲取實際沸騰和熔化溫度,並將值附加到字元串的末尾。

這似乎也適用於您連結到的較大文件,但輸出null缺少的溫度數據。

引用自:https://unix.stackexchange.com/questions/544647