如何用jq计算阶段间滚动时间差并生成含延迟字段的结果?
用jq计算阶段间的时间延迟
需求说明
输入是包含各阶段提交时间、完成时间的JSON数组,需要为每个阶段添加两个字段:
delayTillNextStageSubmit:当前阶段完成时间到下一阶段提交时间的间隔(最后一个阶段为null)delayFromPrevStageComplete:上一阶段完成时间到当前阶段提交时间的间隔(第一个阶段为null)
输入示例
[ { "stageId": 1, "submitTime_epoch_secs": 5, "completionTime_epoch_secs": 10 }, { "stageId": 2, "submitTime_epoch_secs": 15, "completionTime_epoch_secs": 17 }, { "stageId": 3, "submitTime_epoch_secs": 29, "completionTime_epoch_secs": 30 } ]
jq实现命令
jq ' range(0; length) as $i | .[$i] + { delayTillNextStageSubmit: (if $i < length - 1 then .[$i+1].submitTime_epoch_secs - .[$i].completionTime_epoch_secs else null end), delayFromPrevStageComplete: (if $i > 0 then .[$i].submitTime_epoch_secs - .[$i-1].completionTime_epoch_secs else null end) } | [.] | add ' input.json
输出结果
[ { "stageId": 1, "submitTime_epoch_secs": 5, "completionTime_epoch_secs": 10, "delayTillNextStageSubmit": 5, "delayFromPrevStageComplete": null }, { "stageId": 2, "submitTime_epoch_secs": 15, "completionTime_epoch_secs": 17, "delayTillNextStageSubmit": 12, "delayFromPrevStageComplete": 5 }, { "stageId": 3, "submitTime_epoch_secs": 29, "completionTime_epoch_secs": 30, "delayTillNextStageSubmit": null, "delayFromPrevStageComplete": 12 } ]
逻辑解释
- 遍历数组索引:用
range(0; length)获取每个元素的索引$i - 添加延迟字段:
delayTillNextStageSubmit:判断当前索引不是最后一个时,用下一阶段的提交时间减去当前阶段的完成时间;否则设为nulldelayFromPrevStageComplete:判断当前索引不是第一个时,用当前阶段的提交时间减去上一阶段的完成时间;否则设为null
- 重组数组:通过
| [.] | add将处理后的单个对象重新组合成数组
内容的提问来源于stack exchange,提问作者pankajsaha
相关产品推荐
相关产品推荐

