포함된 상위 키를 사용하여 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온도 데이터가 없습니다.

관련 정보