jq로 json을 파싱하려고 합니다.
{
"xxx": {
"aliases": {
"business_event": {
"is_write_index": true
}
},
"mappings": {
"business_event_doc": {
"properties": {
"clientName": {
"type": "keyword"
},
"componentName": {
"type": "keyword"
},
"correlationId": {
"type": "keyword"
},
"executionTime": {
"type": "long"
},
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
}
}
}
}
결과가 다음과 같도록 type == "text"인 속성 목록을 구성해야 합니다.
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
선택기를 사용해 보았지만 결과가 유효하지 않습니다.
.xxx.mappings[].properties | select (.[].type=="text")
하위 노드를 쿼리하고 상위 노드를 반환하는 올바른 방법은 무엇입니까?
답변1
문제
.xxx.mappings[].properties | select(.[].type=="text")
예, select
전체 개체(배열이 아님)는 properties
하위 개체가 포함된 횟수만큼 선택됩니다 .type == "text"
.
여기서 사용할 수 있습니다 with_entries
:
jq '.xxx.mappings[].properties | with_entries(select(.value.type == "text"))' file
이는 with_entries
속성을 반복합니다. select
다음과 같은 요소 배열을 가져옵니다 .
{
"key": "clientName",
"value": {
"type": "keyword"
}
}
select
요소를 선택 .value.type == "text"
하고 다시 일반 개체로 바꿉니다.
출력은 다음과 같습니다
{
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
JSON 문서는 "기본" 키(키는 객체의 일부가 아님)를 포함할 수 없으므로 요청한 출력의 정확한 형식은 유효한 JSON이 아닙니다.
답변2
대안을 고려하고 싶다면 다음은 walk-path unix 유틸리티를 기반으로 한 대안입니다.jtc
:
bash $ <file.json jtc -w'[type]:<text>:[-1]' -l
"fullDescription": {
"type": "text"
}
"shortDescription": {
"type": "text"
}
bash $
walk-path( -w
)는 여기에서 매우 간단합니다:
[type]:<text>:
- 재귀적으로 각각(모두)을 찾은"type": "text"
다음 발견된 항목에서 찾습니다.[-1]
- 레벨 1(Json 트리)을 백업하여 해당 상위 항목을 효과적으로 선택합니다.
-l
도보 항목의 인쇄를 나타내는 라벨
jtc
PS> 공개: 저는 이 도구의 제작자입니다.