埋め込まれた親キーを使用したJQフィルタデータ

埋め込まれた親キーを使用したJQフィルタデータ

与えられたコンテンツを含む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 ...

どうすればいいですか?

答え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温度データはありません。

関連情報