基于jq查找大型JSON文件中键为ENTITY值为TEXT的所有嵌套路径
任意层级匹配JSON指定键值节点路径方案
核心查询命令
直接使用jq内置的递归路径查询能力,无需提前指定JSON结构层级,匹配所有键为ENTITY且值为TEXT的节点并输出路径:
jq -c 'paths as $p | select(getpath($p) == "TEXT" and $p[-1] == "ENTITY") | $p' 目标文件.json
命令说明
paths函数会递归遍历JSON所有层级,输出每个节点的路径数组,例如["root", "list", 3, "ENTITY"]代表路径为根节点下的root字段→list数组第4个元素→ENTITY键$p[-1] == "ENTITY"筛选当前节点的键名为ENTITYgetpath($p) == "TEXT"筛选当前节点的取值为TEXT- 最终输出的路径数组可直接对应到节点的嵌套位置
易读格式输出
如果需要输出常规点分隔的路径格式(数组索引用方括号标注),可使用以下命令:
jq -r 'paths as $p | select(getpath($p) == "TEXT" and $p[-1] == "ENTITY") | $p | map(if type == "number" then "[" + tostring + "]" else . end) | join(".") | gsub("\\.\\[";"[")' 目标文件.json
示例输出:metadata.content[5].ENTITY
超大文件优化
针对数十万行甚至GB级别的JSON文件,可开启流式处理模式,无需全量加载文件到内存即可完成查询:
jq -n --stream 'fromstream(1|truncate_stream(inputs)) | paths as $p | select(getpath($p) == "TEXT" and $p[-1] == "ENTITY") | $p' 大体积目标文件.json
内容的提问来源于stack exchange,提问作者curiousity
相关产品推荐
相关产品推荐

