如何借助jq按固定数量拆分JSON对象并存为独立文件
基于jq的NDJSON按固定条数拆分实现
完全可以通过jq实现上述拆分需求,以下是可直接落地的操作命令:
针对当前场景的直接实现
你的输入文件为15个逐行存储的独立JSON对象,拆分要求为每5个对象为一组存入独立文件,对应可直接运行的命令如下:
- 提取前5个对象存入
FirstTopObject.json
jq -n '[inputs] | .[0:5][]' 你的输入文件路径.ndjson > FirstTopObject.json
该命令会精准匹配storeId为0001到0005的5个对象,逐行保持NDJSON格式输出。
- 提取第6到第10个对象存入
SecondTopObject.json
jq -n '[inputs] | .[5:10][]' 你的输入文件路径.ndjson > SecondTopObject.json
该命令会匹配storeId为0006到0010的5个对象。
- 提取最后5个对象存入
ThirdTopObject.json
jq -n '[inputs] | .[10:15][]' 你的输入文件路径.ndjson > ThirdTopObject.json
该命令会匹配storeId为0011到0015的5个对象。
实现逻辑说明
[inputs]:逐行读取NDJSON输入内容,聚合为包含所有对象的JSON数组,保证索引顺序和文件内的行序完全一致。.[start:end]:通过数组切片语法精准截取对应索引范围的对象,和你要求的分组阈值完全匹配。.[]:将截取的数组逐元素展开输出,保持原有的逐行JSON格式,不会将内容聚合为单个数组结构。
大文件场景的优化实现
如果输入NDJSON文件体积较大,无法一次性加载到内存,可通过单进程流处理的方式完成拆分,全程逐行读取文件,无全量内存加载:
jq -n ' reduce inputs as $item ({seq:0, batch1:[], batch2:[], batch3:[]}; .seq += 1 | if .seq <= 5 then .batch1 += [$item] elif .seq <= 10 then .batch2 += [$item] else .batch3 += [$item] end ) | ( .batch1[] | tostring | "printf %s\\n \(.) >> FirstTopObject.json" , (.batch2[] | tostring | "printf %s\\n \(.) >> SecondTopObject.json") , (.batch3[] | tostring | "printf %s\\n \(.) >> ThirdTopObject.json") ) ' 你的输入文件路径.ndjson | bash
结果校验
生成三个文件后,可通过以下命令快速验证内容正确性:
- 查看第一个文件的storeId列表
jq -r '.storeId' FirstTopObject.json
预期输出按顺序为0001、0002、0003、0004、0005。
- 查看第二个文件的storeId列表
jq -r '.storeId' SecondTopObject.json
预期输出按顺序为0006、0007、0008、0009、0010。
- 查看第三个文件的storeId列表
jq -r '.storeId' ThirdTopObject.json
预期输出按顺序为0011、0012、0013、0014、0015。
内容的提问来源于stack exchange,提问作者Sivakumar Palanisamy
相关产品推荐
相关产品推荐

