You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

脚本逻辑说明

  1. 先用jq读取$SUCCESS_FILE中的路径,生成包含base_file和ack_file的JSON对象数组
  2. 用jq -c '.[]'将数组拆分为单个紧凑格式的JSON对象,方便Shell循环读取
  3. 在循环中提取每个文件对的路径,执行原有的合并提取逻辑:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:40:17