jq를 사용하여 하위 노드 선택기를 통해 상위 노드 가져오기

jq를 사용하여 하위 노드 선택기를 통해 상위 노드 가져오기

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도보 항목의 인쇄를 나타내는 라벨

jtcPS> 공개: 저는 이 도구의 제작자입니다.

관련 정보