如何使用jq将大型JSON文件按指定对象数量拆分?
用jq拆分大型JSON文件的完美方案
嘿,这个需求用jq完全能搞定,而且方法挺直接的!针对你那400万顶层对象的JSON文件,要拆成每个含10000个对象的小文件,我推荐两种方法,其中第一种处理大文件更高效:
方法一:jq + split 组合(推荐,性能更优)
这种方法先把JSON数组拆成单行对象,再用split按行数分割,最后把每行重新组合成JSON数组,全程内存占用低,超适合处理超大型文件。
直接运行这条命令就行:
jq -c '.[]' large_data.json | split -l 10000 -d -a 4 - 'batch_' --filter='jq -s . > $FILE.json'
命令拆解:
jq -c '.[]' large_data.json:把原JSON数组里的每个顶层对象单独输出成一行(-c是紧凑模式,确保每个对象占一行),这一步是为了让split能按行数精准分割。split -l 10000 -d -a 4 - 'batch_':-l 10000:每10000行分割成一个文件-d:用数字作为文件后缀(比如0000、0001)-a 4:后缀保留4位数字(足够覆盖400个拆分文件,400万/10000=400)-:表示从标准输入读取内容batch_:拆分后的文件前缀
--filter='jq -s . > $FILE.json':把split分割出的每行对象重新组合成JSON数组(jq -s .会把多行JSON对象合并成一个数组),并保存为带.json后缀的文件。
方法二:纯jq实现(适合小文件,内存压力大)
如果不想用split,纯jq也能实现,但处理400万对象的大文件时,内存占用会比较高,只推荐测试小文件时用:
jq -n ' input | .[] | group_by((input_line_number - 1) / 10000 | floor)[] | {batch: .} | save("batch_\(._index).json")' large_data.json
不过注意,这个方法需要jq支持save函数(jq 1.6及以上版本),而且大文件下可能因为内存问题变慢。
验证结果
拆分完成后,你可以随便挑一个文件验证对象数量:
jq 'length' batch_0000.json
输出应该是10000,每个对象的嵌套结构也会完整保留,和原文件完全一致。
内容的提问来源于stack exchange,提问作者Chaz
相关产品推荐
相关产品推荐

