난 쓸수있다
> 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"
자체적으로 를 제외하는 것이 더 깔끔할 것입니다. 글을 쓰는 것만으로도 문제가 해결되지만 레이어가 발생하기도 합니다. 내부에서 을 삭제하는 올바른 방법은 무엇입니까?jq
null
select(.a != null)
{}
null
jq
답변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"