如何使用jq按索引对应合并两个数组,为对象元素新增inode字段
如何使用jq将一个数组的内容映射到另一个数组的对应值中?
可用实现方案
方案1:使用transpose配对(代码更简洁)
jq -s '[transpose[] | .[0] + {inode: .[1]}]' a.json b.json
逻辑说明
-s参数会将两个输入文件的JSON内容读取为一个外层数组,其中.[0]对应第一个对象数组,.[1]对应第二个inode字符串数组transpose会将两个长度相同的数组按索引配对,生成[[对象1, inode1], [对象2, inode2], ...]的结构- 遍历每一组配对,给原有对象新增
inode字段后重新组装为数组即可
方案2:使用to_entries按索引匹配
jq -s '.[0] as $obj_arr | .[1] as $inode_arr | $obj_arr | to_entries | map(.value + {inode: $inode_arr[.key]})' a.json b.json
逻辑说明
to_entries会将第一个数组转换为带索引的结构,每个元素为{"key": 索引值, "value": 原对象}- 遍历转换后的数组时,用当前元素的索引
key取第二个数组中对应位置的inode值,合并到原对象中
原命令错误原因
你之前的写法错误修改了原有的path字段,且没有建立第一个数组元素和第二个数组索引的对应关系,导致赋值逻辑混乱。
内容的提问来源于stack exchange,提问作者ー PupSoZeyDe ー
相关产品推荐
相关产品推荐

