如何结合jq脚本批量处理JSON文件对?Shell方案备选
批量合并JSON文件并提取字段的Zsh解决方案
由于jq无法直接遍历文件路径数组并读取对应外部文件内容,这里结合Zsh脚本实现批量处理需求:
基础版脚本(逐个输出结果)
#!/usr/bin/env zsh # 从SUCCESS_FILE生成文件对数组,遍历处理每个文件组合 jq -Rn ' [inputs] | map({ base_file: ., ack_file: (.[:-5] + "_acknowledgement.json") })' < "$SUCCESS_FILE" | jq -c '.[]' | while read -r file_pair; do # 提取base和ack文件的路径 local base_file=$(echo "$file_pair" | jq -r '.base_file') local ack_file=$(echo "$file_pair" | jq -r '.ack_file') # 执行合并与字段提取操作 jq -s 'add' < "$base_file" < "$ack_file" | jq '{ success: .result == "ok", event_type, start_time, end_time }' done
脚本逻辑说明
- 先用jq读取
$SUCCESS_FILE中的路径,生成包含base_file和ack_file的JSON对象数组 - 用
jq -c '.[]'将数组拆分为单个紧凑格式的JSON对象,方便Shell循环读取 - 在循环中提取每个文件对的路径,执行原有的合并提取逻辑:
jq -s 'add'合并两个JSON文件的内容- 二次调用jq提取指定字段并格式化输出
进阶版脚本(合并为JSON数组输出)
如果需要将所有处理结果合并成一个JSON数组输出,可使用以下版本:
#!/usr/bin/env zsh local results=() # 遍历处理每个文件对,收集结果 jq -Rn ' [inputs] | map({ base_file: ., ack_file: (.[:-5] + "_acknowledgement.json") })' < "$SUCCESS_FILE" | jq -c '.[]' | while read -r file_pair; do local base_file=$(echo "$file_pair" | jq -r '.base_file') local ack_file=$(echo "$file_pair" | jq -r '.ack_file') # 生成单个结果并加入数组 local result=$(jq -s 'add' < "$base_file" < "$ack_file" | jq -c '{ success: .result == "ok", event_type, start_time, end_time }') results+=("$result") done # 将结果数组格式化为JSON输出 echo "[${(j:,:)results}]"
内容的提问来源于stack exchange,提问作者Maths noob
相关产品推荐
相关产品推荐

