주어진 콘텐츠가 포함된 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
온도 데이터가 없습니다.