JQ 플랫 객체를 CSV로

JQ 플랫 객체를 CSV로

이 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"
}]

관련 정보