다음 file1 json이 있습니다.
{
"name": "eye",
"attributes": [
{
"name": "Width",
"value": "1920"
},
{
"name": "Height",
"value": "1080"
},
{
"name": "WinKeyMapping",
"value": "leftwin"
}
],
"starts": [
{
"name": "step1",
"attributeList": [
{
"name": "Command",
"value": "bash"
},
{
"name": "Test",
"value": "none"
}
]
}
]
}
그리고 다음 필터:
$ jq '.starts[].attributeList[]|select(.name=="Command")' file1
{
"name": "Command",
"value": "bash"
}
$
이 선택 항목의 전체 구조를 어떻게 얻을 수 있습니까?
예상 출력:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}
답변1
직접적으로jq
:
jq '{ starts: [ { attributeList: (.starts[].attributeList
| map(select(.name == "Command"))) }] }' file.json
산출:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}
답변2
다음은 원하는 출력을 얻는 두 가지 옵션입니다.
원하지 않는 키를 제거할 수 있습니다.
jq 'del(.attributes, .name) |
.starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'
또는 원하는 키를 선택할 수도 있습니다.
jq 'to_entries | map(select(.key == "starts")) | from_entries |
.starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'
둘 다 동일한 결과를 제공합니다. 또한 원하는 경우 starts
후자 ends
의 경우 추가 or
명령문을 추가할 수 있습니다 map(select((.key == "starts") or (.key == "ends")))
.
답변3
보다 일반적인 접근 방식은 다음과 같습니다 jq
.
def pick_out(q): path(q) as $path | ($path | length) as $length |
delpaths(
[
paths(..) |
select(length <= $length and $path[0:length] != . )
]
);
이는 jq
주어진 인수(호출일 수 있음)의 경로 어디에도 없는 문서에 대한 모든 경로를 제거하는 함수 입니다 select()
.
저장하면 pick_out.jq
다음과 같이 사용할 수 있습니다.
jq 'include "pick_out";
pick_out(
.starts[].attributeList[] | select(.name == "Command")
)' file.json
산출:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}