下面是json:
{
"foo": {},
"bar": {
"a": {
"tags": [
"x",
"y"
],
"cycle": "simple"
},
"b": {
"tags": [
"x"
],
"cycle": null
}
},
"baz": {
"c": {
"tags": [
"y"
],
"cycle": null
}
},
"qux": {
"d": {
"tags": [
"x",
"y",
"z"
],
"cycle": "complex"
}
}
}
我想删除顶层对象中所有具有"cycle == null"
的对象。在过滤"cycle"
时,我不知道如何访问早期过滤器中的字段:
$ jq '.[] | .[] | select(.cycle != null)' data.json
{
"tags": [
"x",
"y"
],
"cycle": "simple"
}
{
"tags": [
"x",
"y",
"z"
],
"cycle": "complex"
}
我想保留匹配条目的结构,类似于以下内容:
{
"bar": {
"a": {
"tags": [
"x",
"y"
],
"cycle": "simple"
}
},
"qux": {
"d": {
"tags": [
"x",
"y",
"z"
],
"cycle": "complex"
}
}
}
我希望写类似于jq '.*.*. | select(.cycle != null)'
的东西,这样我就不需要手动重新组装原始结构,但我不理解通配符。
1条答案
按热度按时间bnl4lu3b1#
.[] |= …
(或map_values(…)
)允许您操作对象的内容,而不会丢失外部结构。嵌套两次,以达到两个级别的深度。select(.cycle != null)
是您的主过滤器,但我还在中间级别添加了select(. != {})
,因为您想要的输出不包括"foo": {}
。Demo