You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令解析

  1. 加载并处理排除列表

    • --slurpfile excludes args.json:将args.json的内容读取为字符串数组存入变量$excludes
    • $excludes |= map(gsub("^\"|\"$"; "")):去除每个排除子串前后的双引号(适配你提供的args.json格式)
  2. 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:06:15