如何使用 JQ 从 JSON 中删除不需要的项目?
How to remove unnecessary items from an JSON with JQ?
我需要这个:(示例)
{
"jobs": [
{},
{}
],
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"foo": true,
"version": "master"
},
"service-3": {
"bar": "baz"
}
}
}
做这个:
{
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"version": "master"
}
}
}
所以删除除.services.*.version
以外的所有内容。请帮忙,以我对JQ的了解无法处理。
如果您想区分“版本”不存在或为空:
{services}
| .services |= map_values(select(has("version")) | {version} )
非常笼统地翻译您的表达式 .services.*.version
,您可以按如下方式使用 tostream
:
reduce (tostream
| select(length==2 and
(.[0] | (.[0] == "services" and
.[-1] == "version")))) as $pv (null;
setpath($pv[0]; $pv[1]) )
使用 jq 的流解析器
为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,如上 reduce
或 fromstream
:
jq -n --stream -f program.jq input.json
其中 program.jq 包含:
fromstream(inputs
| select( if length == 2
then .[0] | (.[0] == "services" and
.[-1] == "version")
else . end ) )
.services.*.version.*
更广泛地解释 .services.*.version
,以便不要求路径的终端组件是 .version
,只需替换
.[-1] == "version"
有:
index("version")
在上面。
我需要这个:(示例)
{
"jobs": [
{},
{}
],
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"foo": true,
"version": "master"
},
"service-3": {
"bar": "baz"
}
}
}
做这个:
{
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"version": "master"
}
}
}
所以删除除.services.*.version
以外的所有内容。请帮忙,以我对JQ的了解无法处理。
如果您想区分“版本”不存在或为空:
{services}
| .services |= map_values(select(has("version")) | {version} )
非常笼统地翻译您的表达式 .services.*.version
,您可以按如下方式使用 tostream
:
reduce (tostream
| select(length==2 and
(.[0] | (.[0] == "services" and
.[-1] == "version")))) as $pv (null;
setpath($pv[0]; $pv[1]) )
使用 jq 的流解析器
为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,如上 reduce
或 fromstream
:
jq -n --stream -f program.jq input.json
其中 program.jq 包含:
fromstream(inputs
| select( if length == 2
then .[0] | (.[0] == "services" and
.[-1] == "version")
else . end ) )
.services.*.version.*
更广泛地解释 .services.*.version
,以便不要求路径的终端组件是 .version
,只需替换
.[-1] == "version"
有:
index("version")
在上面。