如何解决如何使用jq从某些嵌套级别删除或忽略值 maxdepth2
我有一个深层嵌套的JSON,它太大了,无法浏览。我想从某个嵌套级别中删除所有项目,最好使用jq
。
说,JSON是:
{
"paging": {
"next": "items?page=12","previous": "items?page=10"
},"hits": {
"total": 10200,"max_score": 1,"hits": [
{
"id": 1337,"really large struct 1": "with long and complexed nested values"
},{
"id": 1338,"really large struct 1": "with long and complexed nested values"
}
]
},"took": 11,"timed_out": false
}
在此示例中,我想省略.hits.hits
下的所有内容,或者将其替换为省略号(...)或直接忽略它。一个不错的选择是在示例中仅呈现id
值。
paging
,took
和timed_oud
之类的字段是示例,可以更改,或者是一个相当长且冗长的列表,因此只需允许将所有应保留的内容列入清单(白名单)不是一种选择:我想过滤掉某个深度而不显示出来;不过,对某些被拒绝列出(列入黑名单)的项目进行过滤(例如删除所有.hits.hits.*
)是可以的。
我尝试过jq '.' | cut -c1-40
,这样就不需要进行水平滚动和/或换行,而无需进行较长的垂直滚动。
解决方法
我想从某个嵌套级别中删除所有项目
这是一个针对任何给定级别$ n进行此操作的函数:
def maxdepth($n):
. as $in
| reduce paths as $p (null;
if ($p|length) > $n
then .
else ($in | getpath($p) ) as $v
| if ($p|length) == $n
then if (($v|type =="object") and ($v|length>1))
then setpath($p; "{...}" )
elif (($v|type == "array") and ($v|length>1))
then setpath($p; "[...]" )
else setpath($p; $v)
end
else setpath($p; $v)
end
end) ;
maxdepth(2)
使用您的示例,maxdepth(2)
产生:
{
"paging": {
"next": "items?page=12","previous": "items?page=10"
},"hits": {
"total": 10200,"max_score": 1,"hits": "[...]"
},"took": 11,"timed_out": false
}
,
使用以下程序将.hits.hits
的所有成员更新为仅保留id
字段,我想这就是您要查找的内容。
.hits.hits[] |= {id}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。