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

如何在Azure Pipeline中用jq合并子文件夹文件中的数组

解决Azure Pipeline中jq合并多JSON数组的问题

问题分析

你原脚本的核心问题:

  1. 变量大小写错误:Linux系统区分大小写,循环变量是objectFile,但你用了$objectfile,导致实际未正确读取子目录下的object.json文件
  2. 输出处理逻辑错误:循环中每次的jq输出都被管道到最后一个jq -s .,这会把每次循环生成的完整JSON对象收集成一个数组,最终得到多个独立JSON对象的数组,而非合并后的单个对象
  3. 文件读写冲突:直接在循环中对allobjects.json进行读写操作,可能因文件未完全读取就被截断写入,导致数据异常

解决方案

方案一:一次性合并(推荐,更高效简洁)

无需循环,直接用jq一次性处理基础文件和所有目标JSON文件,将所有数组元素合并到基础模板中:

jq -n '
  input as $base
  | $base | .parameters.objects.value = [inputs.parameters.objects.value[]]
' noobjects.json OBJ*/object.json > allobjects.json

逻辑说明:

  • -n:让jq不自动读取所有输入,而是手动控制读取流程
  • input as $base:读取第一个输入文件(noobjects.json)作为基础模板
  • [inputs.parameters.objects.value[]]:读取剩余所有OBJ*/object.json文件,将每个文件中parameters.objects.value的数组元素展开,合并成一个大数组
  • 将基础模板中的parameters.objects.value替换为这个合并后的大数组,最终输出到allobjects.json

方案二:修复循环脚本

如果你更倾向于用循环逐步合并,可修改脚本如下(避免读写冲突和变量错误):

cp noobjects.json allobjects.json
# 用glob遍历所有OBJ开头的子目录,比ls更可靠
for dir in OBJ*/; do
  # 用临时文件存储中间结果,避免读写同一文件的冲突
  jq -s '.[0].parameters.objects.value += .[1].parameters.objects.value | .[0]' allobjects.json "${dir}object.json" > temp.json
  mv temp.json allobjects.json
done

逻辑说明:

  • 用OBJ*/直接匹配子目录,避免ls命令在文件名含特殊字符时出错
  • 每次合并结果先写入临时文件temp.json,再替换原文件allobjects.json,避免读写同一文件导致的数据损坏
  • 修正了变量名问题,用${dir}object.json正确拼接文件路径

验证结果

运行上述任一方案后,allobjects.json中的parameters.objects.value字段会包含所有子目录下object.json文件中的数组元素,结构与你期望的输出一致。

内容的提问来源于stack exchange,提问作者NLInnett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:15:32