【发布时间】:2026-02-09 12:35:01
【问题描述】:
我有一堆十万行 json 文件,我正在尝试弄清楚它们的结构。
我想打印所有名为“ENTITY”且值为“TEXT”的键的路径。
这些可以嵌套在任何级别。有很多示例可以在特定级别找到一个,例如Select objects based on value of variable in object using jq
但我实际上是想弄清楚这些项目的嵌套位置,因为文件太大,我无法通过检查来做到这一点。
【问题讨论】:
我有一堆十万行 json 文件,我正在尝试弄清楚它们的结构。
我想打印所有名为“ENTITY”且值为“TEXT”的键的路径。
这些可以嵌套在任何级别。有很多示例可以在特定级别找到一个,例如Select objects based on value of variable in object using jq
但我实际上是想弄清楚这些项目的嵌套位置,因为文件太大,我无法通过检查来做到这一点。
【问题讨论】:
【讨论】:
如果我正确理解了您的问题,那么您正在搜索具有给定键/字段且其值与给定值匹配的叶子。这种方法使用leaf_paths 获取所有叶子以及getpath 来获取它们的值,transpose 将它们组合起来,最后使用select 将列表减少到符合条件的那些。输出只是路径数组。
jq --arg key "ENTITY" --arg value "TEXT" '
[[leaf_paths],[getpath(leaf_paths)]]
| transpose
| map(select(.[0][-1] == $key and .[1] == $value))[][0]
'
【讨论】:
leaf_paths 已弃用,将在下一个主要版本中删除。”请改用paths(scalars)。
leaf_paths as $p | [$p, getpath($p)] | select(.[0][-1] == $key and .[1] == $value)
paths(. == $value) | select(.[-1] == $key)。不过,我仍然更喜欢我的 (paths( objects | .ENTITY == "TEXT" ))。 1) 它给出了对象的路径,而不是以ENTITY 结束所有路径。 2)它更干净。 3) 越早过滤也应该越快。