如何使用jq根据字符串ID移除JSON数组中匹配的对象
用jq实现JSON数组去重(按指定字段)
要解决的问题:从file1中移除所有data.id与file2重复的对象,只保留不重复的条目。
你之前命令的问题
- id提取错误:
$dst | [.data[].id]写法不对,因为$dst是数组,每个元素是带data的对象,正确提取id列表应该是$dst | map(.data.id)。 in操作符用错了:jq里in是用来检查对象的键,不是数组元素,直接用数组会触发“Cannot check whether string has a string key”错误,得把id列表转成键值对对象才能用。
正确的jq命令
jq -n --argfile src /var/tmp/w-src.json --argfile dst /var/tmp/w-dst.json ' # 把file2的id转成查找对象,方便快速判断 ($dst | map({(.data.id): true}) | add) as $exclude_ids # 筛选file1中id不在排除列表里的对象 | $src | map(select(.data.id | not(in($exclude_ids)))) '
命令说明
($dst | map({(.data.id): true}) | add):把file2里的所有data.id做成一个像{"61": true, "63": true}的对象,这样判断id是否存在的效率很高。$src | map(select(.data.id | not(in($exclude_ids)))):遍历file1的每个对象,只保留那些data.id不在排除对象里的条目,最终输出就是你要的结果。
运行结果
执行后输出和你期望的完全一致:
[ { "data": { "id": "2", "nodes": [ { "stuff": "foo" } ] } }, { "data": { "id": "6", "nodes": [ { "stuff": "bar" } ] } } ]
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

