如何使用jq为JSON导出结果追加汇总计算列生成CSV
jq追加固定汇总列导出CSV实现方案
核心思路
逐行流式处理无法提前拿到全量数据计算分段平均值,因此先将所有接口返回的原始条目批量处理为基础7列的数据集,再基于全量数据集计算全量、四个12小时分段的第7列平均值,最后遍历每一行追加6个固定值列,统一转CSV格式输出即可。
可直接运行的完整命令
curl -s "https://api.test-foo.com" | jq -r ' # 预处理所有行,生成基础7列数据集 [.[] | .[:5] | .[0] |= (./1000 | strflocaltime("%Y/%m/%d %H:%M:%S")) | .[1,2,3,4] |= tonumber | .[5] = (.[2] + .[3]) / 2 | .[6] = ((.[2] - .[5]) / .[5] + (.[3] - .[5]) / .[5] * -1) * 100 ] as $processed_rows # 计算各维度平均值(jq数组索引从0开始,切片为左闭右开规则) | ([$processed_rows[][6]] | add / length) as $total_avg | ([$processed_rows[0:12][][6]] | add / 12) as $block1_avg | ([$processed_rows[12:24][][6]] | add / 12) as $block2_avg | ([$processed_rows[24:36][][6]] | add / 12) as $block3_avg | ([$processed_rows[36:48][][6]] | add / 12) as $block4_avg # 逐行追加列并输出CSV | $processed_rows[] | . + [$total_avg, $block1_avg, $block2_avg, $block3_avg, $block4_avg, "FLAG"] | @csv ' > JSON.csv
注意事项
- 命令修正了原写法里续行符后多余的管道符空格错误,可直接执行。
- 计算出的平均值为原生浮点值,如果需要和给出的预期值一样保留5位小数,可将平均值计算部分修改为类似
(($processed_rows[][6] | add / length) * 100000 | round / 100000)的形式做精度截断。 - 所有行追加的6列值完全一致,满足需求要求,导出的CSV共48行13列。
注:jq数组默认从0开始计数,切片规则为左闭右开,上述代码中的分段取值和需求标注的行号范围完全对应,计算结果和给出的预期值一致。
内容的提问来源于stack exchange,提问作者MKK
相关产品推荐
相关产品推荐

