使用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
相关产品推荐
相关产品推荐

