如何使用jq基于公共key关联合并两个及以上JSON文件
双文件关联匹配解决方案
问题原因说明
你之前仅能拿到c2最后一项的原因是:INDEX构建索引时遇到重复的key会直接覆盖旧值,你为有重复type的c2构建索引时,每个type只会保留最后一条记录,自然无法匹配到所有c2条目。
实现命令
执行以下命令即可得到符合要求的输出:
jq -n 'input | .c1 | INDEX(.type) as $c1_idx | input | .c2[] | select(.type | in($c1_idx)) | $c1_idx[.type] + .' c1.json c2.json
如果需要输出为单个数组格式,修改为如下命令即可:
jq -n '[ input | .c1 | INDEX(.type) as $c1_idx | input | .c2[] | select(.type | in($c1_idx)) | $c1_idx[.type] + . ]' c1.json c2.json
命令逻辑拆解
-n参数:关闭jq自动读取输入的默认行为,手动控制输入流的处理顺序- 第一步读取第一个输入文件
c1.json,提取c1数组后用INDEX(.type)构建以type为key、对应c1对象为值的索引,存入变量$c1_idx(因为c1的type唯一,不会有覆盖问题) - 第二步读取第二个输入文件
c2.json,展开c2数组的每一条记录 select过滤:仅保留type存在于$c1_idx中的c2记录,自动排除c2独有的type- 用
+合并匹配到的c1对象和当前c2对象,两边的所有字段都会保留,同名字段会以后面的c2字段值为准(如果需要c1字段优先,调换顺序为. + $c1_idx[.type]即可)
多文件扩展说明
扩展为基于同一个公共key关联三个甚至更多JSON文件难度极低,逻辑和双文件关联完全一致:
- 先为所有需要关联的集合,基于公共key构建索引存入变量
- 以需要保留key的集合为基准遍历,过滤出公共key同时存在于所有索引中的记录
- 合并所有匹配到的对象即可
举个三文件关联的示例命令(假设第三个文件c3.json同样用type作为公共key):
jq -n 'input | .c1 | INDEX(.type) as $c1_idx | input | .c2 | INDEX(.type) as $c2_idx | input | .c3[] | select(.type | in($c1_idx) and in($c2_idx)) | $c1_idx[.type] + $c2_idx[.type] + .' c1.json c2.json c3.json
内容的提问来源于stack exchange,提问作者ewoj
相关产品推荐
相关产品推荐

