JQ를 사용하여 JSON 행 배열 평면화

JQ를 사용하여 JSON 행 배열 평면화

난 쓸수있다

> echo '{"a": "arbiter", "b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'
"arbiter"
"brisk"
"astound"
"bistro"

하지만 내가 그렇게 한다면

> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c'

알겠어요

"arbiter"
"brisk"
[
    "cloak",
    "conceal"
]
"astound"
"bistro"
[
    "confer",
    "consider"
]

c대신 배열을 어떻게 평면화합니까?

"arbiter"
"brisk"
"cloak",
"conceal"
"astound"
"bistro"
"confer",
"consider"

고쳐 쓰다

널 안전성은 여러 현대 언어에서 매우 널리 사용되고 당연하게 여겨지기 때문에 위에서 묻는 질문이 불완전하다고 가정하는 것이 적절합니다. 값이 누락된 경우를 처리하는 방법을 알아야 합니다.

값 중 하나가 이면 null,

> echo '{"b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'

출력에서 null 값을 얻습니다.

null
"brisk"
"astound"
"bistro"

이것이 아마도 우리가 원하는 것입니다. 파이프라인에 두 번째 단계를 추가할 수 있지만(제외하지 않도록 주의) "null"자체적으로 를 제외하는 것이 더 깔끔할 것입니다. 글을 쓰는 것만으로도 문제가 해결되지만 레이어가 발생하기도 합니다. 내부에서 을 삭제하는 올바른 방법은 무엇입니까?jqnullselect(.a != null){}nulljq

답변1

표현 jq방식

[.a, .b, .c]

입력 객체에서 원하는 모든 요소를 ​​추출하여 배열에 넣습니다. 이러한 요소 중 일부는 배열일 수 있으므로 모두 평면화해야 합니다.

[.a, .b, .c] | flatten

입력 개체의 경우

{
  "a": "arbiter",
  "b": "brisk",
  "c": [
    "cloak",
    "conceal"
  ]
}

그러면 배열이 생성됩니다.

[
  "arbiter",
  "brisk",
  "cloak",
  "conceal"
]

두 번째 객체와 비슷하지만 별개의 배열을 얻게 됩니다.

이 두 배열을 하나로 결합하려면 간단히 데이터를 전달하면 되지만 데이터를 .[]쓰는 빠른 방법은 flatten | .[]다음과 같습니다 flatten[]. 이것을 사용하여 우리는

[.a, .b, .c] | flatten[]

요약:

echo '...as in the question...' |
jq '[.a, .b, .c] | flatten[]'

값 도 제거하려면 을 null기준으로 필터링 하거나 값 추출을 사용하거나 select(. != null)이전에 [.a//empty,.b//empty,.c//emtpy]필터링하세요 .map(.//empty)flatten[]


의견: 입력 JSON은 echo질문의 간단한 항목을 사용하여 생성됩니다. 그러나 명령줄에서 JSON을 올바르게 생성하려면 다음과 같은 도구를 사용하는 것이 좋습니다. 이 도구 jo는 JSON 문서에 포함하기 위해 데이터를 적절하게 인코딩합니다.

jo두 번째 예제 JSON은 다음 두 호출을 사용하여 생성할 수 있습니다.

jo a=arbiter b=brisk  'c[]'=cloak  'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider

답변2

이 답변은 업데이트 전에 문제를 해결합니다.

글쎄요, 그건 아주 사소한 일입니다. 이를 줄이기 위해 Python의 멋진 JSON 라이브러리나 awk 또는 sed의 일반성이 필요하지 않습니다. 다음과 같이 작성하면 충분합니다.

> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c[]'

우리는 다음을 얻었습니다:

"arbiter"
"brisk"
"cloak"
"conceal"
"astound"
"bistro"
"confer"
"consider"

관련 정보