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두 개가 아닌 하위 배열.