![JSON: 값이 패턴과 일치하는 키 및 값 쌍을 추출하고 인쇄합니다.](https://linux55.com/image/211898/JSON%3A%20%EA%B0%92%EC%9D%B4%20%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%ED%82%A4%20%EB%B0%8F%20%EA%B0%92%20%EC%8C%8D%EC%9D%84%20%EC%B6%94%EC%B6%9C%ED%95%98%EA%B3%A0%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
JSON:
"{
"a": "https://is2-ssl.com/",
"b": "https://a5.-ssl.com/",
"type": "response",
"c": [
{
"Number": 1,
"Reportname": "XXX",
"size": "2.5",
"Variants": [
"YYY"
]
}
],
"Meta": "ABC"
}
원하는 출력:
XXX,a,https://is2-ssl.com/
XXX,b,https://a5.-ssl.com/
값에 "http"(url)가 포함된 키 값 쌍을 인쇄하고 키와 값을 구분 기호 ","로 병합하고 ReportName을 추가하고 싶습니다.
답변1
"
JSON 문서의 첫 번째 문자의 철자가 틀려서 다음 .ReportName
을 얻고 싶다고 가정해 보겠습니다.첫 번째항목을 배열로 만들고 c
출력을 CSV로 만들고 싶습니다.
$ jq -r '.c[0].Reportname as $n | map_values(select(type == "string" and startswith("http"))) | to_entries[] | [$n, .key, .value] | @csv' file
"XXX","a","https://is2-ssl.com/"
"XXX","b","https://a5.-ssl.com/"
표현방식 jq
:
.c[0].Reportname as $n |
map_values(select(type == "string" and startswith("http"))) |
to_entries[] | [$n, .key, .value] | @csv
먼저 값을 골라 .Reportname
내부 jq
변수 에 할당합니다 $n
. 그런 다음 substring 으로 시작하는 문자열과 연결되지 않은 키를 삭제하여 원본 객체를 다시 작성합니다 http
.
예제 문서는 map_values()
다음과 같이 축소됩니다.
{
"a": "https://is2-ssl.com/",
"b": "https://a5.-ssl.com/"
}
그런 다음 이를 to_entries
동등한 것으로 변환합니다.
[
{ "key": "a", "value": "https://is2-ssl.com/" },
{ "key": "b", "value": "https://a5.-ssl.com/" }
]
...키에 직접 액세스하세요.
배열은 개체 집합으로 확장되고, []
저장된 값은 집합에 있는 각 개체의 일부와 함께 인용된 $n
CSV 출력으로 변환되는 배열을 만드는 데 사용됩니다..key
.value
@csv
jq
동일한 출력을 갖는 또 다른 표현식이지만 이전에 실행된 to_entries
다음 위와 같이 객체의 값 map()
대신 생성된 배열에 대해 작업을 수행합니다 .map_values()
.c[0].Reportname as $n |
to_entries |
map(
select(.value | type == "string" and startswith("http")) |
[$n, .key, .value] | @csv
)[]