如何用jq找出JSON数组中不存在于另一数组的元素?
使用jq提取第一个JSON数组独有的元素
要实现从a.json中筛选出所有不存在于b.json的元素,核心思路是先把第二个数组的元素构建成高效的查找结构,再遍历第一个数组进行筛选。
方法一(高效推荐):用INDEX构建查找表
适合处理较大的数组,查找效率为O(1):
jq --argfile b b.json '[($b | INDEX(.)) as $b_index | .[] | select($b_index[.] | not)]' a.json
命令解释:
--argfile b b.json:将b.json的内容加载到jq变量$b中($b | INDEX(.)) as $b_index:把$b数组转换成一个对象,每个数组元素会被序列化为字符串作为键,对应值为原元素,以此构建快速查找表.[]:遍历a.json数组中的每一个元素select($b_index[.] | not):筛选出在$b_index中没有对应条目(即不存在于b.json)的元素- 外层的
[ ... ]:把筛选后的元素重新组合成数组
方法二:用IN直接判断(简单直观)
适合小体量数组,写法更简洁:
jq --argfile b b.json '[.[] | select(. | IN($b[]) | not)]' a.json
命令解释:
. | IN($b[]):检查当前元素是否存在于$b数组中select(...) | not:保留不存在于$b的元素
运行结果
针对你提供的两个JSON文件,运行上述命令后都会得到预期输出:
[ { "key1": "foo", "key2": "baz" }, { "key1": "bla", "key2": "blubb" } ]
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

