필드 값이 "auto"인 경우 키를 선택하세요.

필드 값이 "auto"인 경우 키를 선택하세요.

구문 분석하려는 JSON 파일이 있습니다. 필드 값이 이면 키 값을 선택하고 싶습니다 auto. 쉘 에서 JSON을 구문 분석하는 데 package2사용하는 .jqbash

{
    "package1":{
        "name":"package_1",
        "value":"manual"
    },
    "package2":{
        "name":"package_2",
        "value":"auto"
    }
}

답변1

그리고

jq 'map_values(select(.value == "auto"))' file

...관심 있는 최상위 개체의 일부를 추출합니다.

{
  "package2": {
    "name": "package_2",
    "value": "auto"
  }
}

를 사용하면 입력 개체의 모든 하위 부분 map_values(expression)에 적용할 수 있습니다 . expression이 경우 해당 부분은예약하다명령문의 테스트가 select()다음과 같이 평가되는 경우진짜, 그렇지 않으면 폐기합니다. 비슷 map(expression)하지만 map()배열과 map_values()객체에 사용할 수 있습니다.

여기에서 최상위 키를 가져오도록 선택할 수 있습니다.

$ jq -r 'map_values(select(.value == "auto"))|keys[]' file
package2

keys함수는 입력 개체의 모든 키 배열을 생성하고 마지막으로 []배열을 문자열 집합으로 확장합니다.

auto키 값 으로 여러 하위 개체가 있는 경우 .value이 명령에서 여러 문자열을 얻게 됩니다 .


.name잠시 동안 키 값을 원하는지 아니면 최상위 키를 원하는지 잘 모르겠습니다 . 나는 당신이 최상위 키만 원한다는 것을 알았을 때 아래 텍스트를 작성했습니다. 이건 댓글로 남겨두겠습니다.

$ jq -r 'map_values(select(.value == "auto"))[].name' file
package_2

최종 사용에서는 [].name최상위 개체를 하위 개체 집합으로 확장한 다음 .name각 하위 개체에서 키 값을 추출합니다.

마지막은 다음과 같이 쓸 수도 있습니다.

$ jq -r 'map_values(select(.value == "auto").name)[]' file
package_2

...원래 객체를 다음과 같이 줄입니다.

{
  "package2": "package_2"
}

...그런 다음 뒤에 오는 키와 함께 나머지 모든 키의 값을 추출합니다 [].

답변2

jq를 사용할 수 있습니다.선택하다()기능:

jq -r '.[] | select(.value=="auto").name'

또한 귀하의 json 예제는 현재 유효하지 않습니다.

관련 정보