如何使用jq比较两个JSON文件并按指定键值删除重复对象
用jq按指定字段比对两个JSON文件提取独有条目
实现命令
简洁通用版(兼容jq 1.5及以上)
jq -n ' # 读取第一个文件内容存入$f1 input as $f1 # 读取第二个文件,过滤User Data数组 | input | .["User Data"] |= map( select( .["Car ID"] as $current_id | $f1["User Data"] | map(.["Car ID"]) | index($current_id) | not ) ) ' file1.json file2.json
高性能版(适合大文件,要求jq 1.6+)
利用内置INDEX函数构建哈希查找表,时间复杂度更低:
jq -n ' input as $f1 | INDEX($f1["User Data"][]; .["Car ID"]) as $exist_map | input | .["User Data"] |= map(select($exist_map[.["Car ID"]] | not)) ' file1.json file2.json
效果验证
以示例文件运行上述命令,输出结果完全符合预期:
{ "User Data": [ { "First Name": "Jeremy", "Last Name": "Blake", "DOB": "1965-09-21", "Car ID": "UJ345IE2" } ] }
注意事项
- 字段名
Car ID包含空格,必须用.["Car ID"]的方式引用,不能直接使用.Car ID的点操作符写法 - 如果你实际使用的JSON文件顶层数组键名不是
User Data,直接替换命令中对应的键名即可
内容的提问来源于stack exchange,提问作者M9A
相关产品推荐
相关产品推荐

