jq를 사용하여 Json 테이블 배열을 객체로 변환

jq를 사용하여 Json 테이블 배열을 객체로 변환

key1: 값 배열, key2: 값 배열, ....의 json 구조를 개체 배열로 변환하려고 합니다. 배열의 크기는 모두 동일하며 각 개체는 각 배열의 x 위치에 있는 항목의 집합일 뿐입니다. 도움이 필요하면 변환을 위해 jq의 범용 코드를 사용하는 것이 가장 좋습니다.

입력하다

{
  "IdentifierName": [
    "A",
    "B",
    "C"
  ],
  "Code": [
    5,
    8,
    19
  ]
}

예상 출력

[
  {
    "IdentifierName": "A",
    "Code": 5
  },
  {
    "IdentifierName": "B",
    "Code": 8
  },
  {
    "IdentifierName": "C",
    "Code": 19
  }
]

편집: 지금까지의 진행 상황:

jq 'to_entries|map(.key) as $keys| (map(.value)|transpose) as $values |$values|map($keys, .)'

마지막 단계는 여전히 올바르게 얻을 수 없는 값으로 키를 인덱싱하는 것입니다.

답변1

내 질문에 대답하려면 다음을 수행하십시오.

jq 'to_entries|map(.key) as $keys| (map(.value)|transpose) as $values |$values|map([$keys, .] | transpose| map( {(.[0]): .[1]} ) | add)'

설명: ["IdentifierName", "Code"] 키와 값을 [ [ "A", 5 ], [ "B", 8 ], [ "C", 19 ] ]로 추출한
다음 키에서 값으로 색인을 생성합니다. json-seq의 키 튜플과 (각각) 값 튜플을 가져와서 전치하고 쌍으로 압축합니다.

 echo '[[
    "IdentifierName",
    "Code"
  ],
  [
    "C",
    19
  ]
]'|jq '.|transpose| map( {(.[0]): .[1]} ) | add'

두 가지를 결합하면 솔루션이 제공됩니다. 이는 요소 수에 관계없이 작동합니다(0과 1은 첫 번째와 두 번째가 아닌 키와 값일 뿐입니다).

답변2

$ jq '[.IdentifierName, .Code] | transpose | map( { "IdentifierName": .[0], "Code": .[1] } ) ' file.json
[
  {
    "IdentifierName": "A",
    "Code": 5
  },
  {
    "IdentifierName": "B",
    "Code": 8
  },
  {
    "IdentifierName": "C",
    "Code": 19
  }
]

두 개의 배열을 하나의 전치 배열(두 개의 배열)로 추출했습니다. 주어진 데이터에 대해 이는 [["A",5],["B",8],["C",19]]. 그런 다음 해당 배열의 각 개별 요소를 원하는 키가 있는 객체에 매핑합니다.

이것은 어떻게든 더 간결해질 수 있습니다. 예를 들면 다음과 같습니다.좋아요끝에 명시적인 키 이름을 사용하여 객체를 다시 작성하는 대신 다음과 같이 요약할 수 있습니다.N두 개가 아닌 하위 배열.

관련 정보