구문 분석하려는 JSON 파일이 있습니다. 필드 값이 이면 키 값을 선택하고 싶습니다 auto
. 쉘 에서 JSON을 구문 분석하는 데 package2
사용하는 .jq
bash
{
"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"
}
...그런 다음 뒤에 오는 키와 함께 나머지 모든 키의 값을 추출합니다 []
.