如何用jq高效过滤包含指定子串的JSON对象?
高效用jq完成JSON过滤与预处理的方案
直接用单次jq命令即可完成去除制表符、过滤空name字段、排除含指定子串的实体所有操作,无需依赖后续grep处理,具体命令如下:
jq --slurpfile excludes args.json ' $excludes |= map(gsub("^\"|\"$"; "")) | .entities | map( select(.name != "") | walk(if type == "string" then gsub("\t"; "") else . end) | select( all($excludes[]; .name | index(.) | not) ) ) ' input.json
命令解析
加载并处理排除列表
--slurpfile excludes args.json:将args.json的内容读取为字符串数组存入变量$excludes$excludes |= map(gsub("^\"|\"$"; "")):去除每个排除子串前后的双引号(适配你提供的args.json格式)
处理input.json数据
.entities:定位到目标实体数组select(.name != ""):过滤掉name为空的无效条目walk(...):递归遍历所有字段,将字符串中的制表符替换为空select( all($excludes[]; .name | index(.) | not) ):仅保留name不包含任何排除子串的实体——index(.)检查子串是否存在,all(...)确保所有排除子串都不匹配
示例验证
针对你提供的示例文件:
- input.json的
entities数组中,id=602的条目name包含排除子串foobar-,会被过滤 - 最终输出仅保留有效条目:
[ { "id": 600, "name": "foo-001" }, { "id": 601, "name": "foo-002" } ]
优势
相比原有的jq+grep组合,该方案仅需一次JSON解析与遍历,避免了中间文件生成和多进程开销,处理大文件时效率提升明显。
内容的提问来源于stack exchange,提问作者kdf58
相关产品推荐
相关产品推荐

