이 JSON 배열의 평면 객체를 평면화해야 합니다.
[{
"key1a": "value1",
"key1b": "value2",
...
"key1z": "value50",
},
{
"key2a": "value2a",
"key2b": "value2b",
...
"key2y": "value2y",
},
{...},{...}]
이 CSV 스타일 출력에
key1a+key1b+key1c... value1a|value1b|value1c...
key2a+key2b+key2c... value2a|value2b|value2c...
사용을 위해 일부 후처리를 수행합니다 awk
.
나는 ja
함수 맵, 추가 및 병합을 사용해 보았으나 성공하지 못했습니다.
답변1
예상되는 출력은 CSV가 아니므로 @csv
;에 있는 연산자를 사용하지 않겠습니다. jq
대신 질문에 언급된 구분 기호를 순진하게 삽입하겠습니다. 입력의 키나 값에 공백이 포함된 경우 +
일부 |
추가 처리 단계에서 적절하게 이스케이프 처리해야 합니다.
+
다음 표현식을 사용하여 jq
키를 구분 기호로 연결할 수 있습니다 .
.[] | keys | join("+")
|
이러한 값은 다음 표현식을 사용하여 jq
구분 기호로 함께 연결할 수 있습니다 .
.[] | [.[]] | join("|")
공백을 구분 기호로 사용하여 각 배열 요소에 대해 두 개의 키-값 문자열을 연결합니다.
.[] |
[
( keys | join("+") ),
( [.[]] | join("|") )
] |
join(" ")
이것을 테스트해 보세요:
$ cat file.json
[
{
"key1a": "value1a",
"key1b": "value2a",
"key1z": "value50"
},
{
"key2a": "value2a",
"key2b": "value2b",
"key2y": "value2y"
}
]
$ jq -r '.[] | [ (keys | join("+")), ([.[]] | join("|")) ] | join(" ")' file.json
key1a+key1b+key1z value1a|value2a|value50
key2a+key2b+key2y value2a|value2b|value2y
답변2
이것이 당신에게 효과가 있습니까?
$ cat input.json | jq -r '.[] | to_entries | ([ .[].key ] | join("+")) + " " + ([ .[].value ] | join("|"))'
key1a+key1b+key1z value1a|value2a|value50
key2a+key2b+key2y value2a|value2b|value2y
$ cat input.json
[{
"key1a": "value1a",
"key1b": "value2a",
"key1z": "value50"
},
{
"key2a": "value2a",
"key2b": "value2b",
"key2y": "value2y"
}]