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

使用jq删除JSONL文件中匹配禁用ID的行

用jq高效过滤大JSONL文件中的禁用ID行

针对20GB的JSONL大文件,jq基于C实现的流式处理能力,既能避免内存溢出,速度也远快于Python脚本,具体命令和适配场景如下:

基础命令(ID为纯字符串,禁用列表每行一个ID)

假设banned_list.txt每行存储一个无引号、无多余空格的禁用ID,JSONL中每个对象的id字段为字符串类型,执行以下命令:

jq --argfile banned banned_list.txt -n '
# 处理禁用列表:分割成行、过滤空行,得到纯净ID数组
($banned | split("\n") | map(select(length > 0))) as $banned_ids |
# 流式读取JSONL的每个对象
inputs |
# 保留ID不在禁用列表中的行
select(.id | IN($banned_ids[]) | not)
' source.jsonl > filtered.jsonl

适配不同ID类型的调整

情况1:JSON中的ID是数字,禁用列表是字符串形式的数字

比如JSON里的id是123(数字类型),banned_list.txt里是123(字符串),需要将禁用列表转成数字数组:

jq --argfile banned banned_list.txt -n '
($banned | split("\n") | map(select(length > 0) | tonumber)) as $banned_ids |
inputs |
select(.id | IN($banned_ids[]) | not)
' source.jsonl > filtered.jsonl

情况2:禁用列表的ID带引号或首尾空格

如果banned_list.txt里的ID包含引号(比如"user456")或多余空格,先清洗数据:

jq --argfile banned banned_list.txt -n '
($banned | split("\n") | map(select(length > 0) | trim | gsub("^\"|\"$"; ""))) as $banned_ids |
inputs |
select(.id | IN($banned_ids[]) | not)
' source.jsonl > filtered.jsonl

关键参数说明

  • --argfile banned banned_list.txt:将禁用列表文件内容整体读入banned变量
  • -n:关闭jq自动读取输入的默认行为,改用inputs实现流式处理,避免加载20GB大文件到内存
  • IN($banned_ids[]):判断当前对象的id是否存在于禁用数组中,| not取反后保留符合要求的行

内容的提问来源于stack exchange,提问作者JohnJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:35:00