使用jq对两个JSON文件做左连接、按键值匹配合并字段的方法
解决方案
直接使用以下兼容jq-1.5-1-a5b5cbe版本的命令即可实现需求:
jq --slurpfile input2 input2.json ' ($input2[0] | map({key: .joinId, value: .}) | from_entries) as $lookup | map(. + ($lookup[.join_id] // {})) ' input1.json
逻辑说明
- 命令通过
--slurpfile参数读取第二个JSON文件,存入$input2变量,由于slurp模式会将文件内容包裹为数组,因此取$input2[0]得到第二个文件的原始记录数组 - 先将第二个文件的记录转换为以
joinId为键的查找字典,查找效率为O(1),大文件场景下也能快速运行 - 遍历第一个文件的所有记录,用当前记录的
join_id字段值匹配查找字典中的对应项:- 匹配成功则将第二个文件的对应字段合并到当前记录
- 匹配失败则用空对象参与合并,不会给无匹配的记录追加多余字段,和示例期望输出完全一致
可选调整
如果你希望无匹配项的记录也固定带上joinId、joinField1、joinField2三个字段(值为null),可以把命令里的// {}替换为// {joinId: null, joinField1: null, joinField2: null}即可。
用你提供的两份示例文件运行上述命令,输出结果和你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者MTS
相关产品推荐
相关产品推荐

