如何用jq和awk拆分大型JSON文件并按Participant_id命名输出
解决方案
纯jq实现(推荐,需jq 1.6+)
直接用jq内置的writefile函数,一步完成拆分、命名和格式化输出,无需额外管道工具,处理大型文件效率更高:
jq '.[] | "\(.Participant_id).json" as $filename | . | writefile($filename)' Metadata_01.json
命令说明:
- 移除了原命令的
-c参数,jq默认会输出格式化缩进的JSON结构。 \(.Participant_id).json提取每个对象的Participant_id字段作为文件名,自动拼接.json后缀。writefile($filename)将当前格式化后的JSON对象写入对应文件。
兼容低版本jq的方案(jq < 1.6)
如果你的jq版本不支持writefile,可以结合bash循环实现:
jq -r '.[] | @sh "\(.Participant_id).json" as $fn | ($fn, .)' Metadata_01.json | while read -r fn && read -d '' -r content; do echo "$content" > "$fn"; done
命令说明:
@sh用于转义文件名中的特殊字符(如空格、引号),避免写入文件时出错。- 先输出文件名,再输出格式化后的JSON内容,通过
while循环分别读取文件名和对应内容,写入目标文件。
注意事项
如果JSON数组中存在重复的Participant_id字段值,后续的对象会覆盖之前生成的同名文件。若需要避免覆盖,可以在文件名中追加序号或其他标识,例如:
jq '.[] | "\(.Participant_id)_(\(input_line_number)).json" as $filename | . | writefile($filename)' Metadata_01.json
内容的提问来源于stack exchange,提问作者gfx2000
相关产品推荐
相关产品推荐

