如何使用JQ实现两个JSON文件内数组的笛卡尔积合并?
两个JSON数组按笛卡尔积合并的JQ实现方法
报错原因
你遇到的报错是因为*运算符不支持直接对两个数组做运算,同时你之前的写法没有正确读取两个文件的内容分别处理,jq默认会逐个处理输入的文件,无法直接在单次处理逻辑中同时拿到两个文件的数组内容。
正确实现命令
如果两个数组的元素没有重复字段,直接使用+合并即可:
jq -n 'input as $file1 | input as $file2 | [ $file1[] as $item1 | $file2[] as $item2 | $item1 + $item2 ]' file1.json file2.json
如果两个数组的元素存在相同字段,想要用第二个数组的字段值覆盖第一个的,可以把+替换为*:
jq -n 'input as $file1 | input as $file2 | [ $file1[] as $item1 | $file2[] as $item2 | $item1 * $item2 ]' file1.json file2.json
命令逻辑说明
-n参数:禁用jq默认读取输入内容到.的行为,方便自主控制输入的读取逻辑input as $file1:读取第一个输入文件file1.json的内容,存储到变量$file1input as $file2:读取第二个输入文件file2.json的内容,存储到变量$file2- 双重遍历逻辑:
$file1[] as $item1遍历第一个数组的所有元素,$file2[] as $item2遍历第二个数组的所有元素,两者组合得到完整的笛卡尔积配对 - 对象合并:
$item1 + $item2会合并两个对象的所有键值对,相同字段默认保留前者的取值 - 外层的
[]:把所有合并后的对象放到同一个数组中,匹配要求的输出格式
执行上述命令后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者niklodeon
相关产品推荐
相关产品推荐

