与えられたコンテンツを含む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
温度データはありません。