如何使用Shell/JQ移除JSON文件中signatureId重复的块
JSON文件按指定字段去重实现方案
需求说明
现有一个包含数千条条目的JSON文件,需要移除内容重复的块,规则如下:
- 去重判断仅依据
signatureId字段,无需关心mode字段的取值 - 出现重复
signatureId时,任意保留其中一个对应条目即可 - 仅可使用Shell和/或JQ工具完成处理
原始文件示例
{ "signatures": [ { "signatureId": 0050, "mode": 0 }, { "signatureId": 0012, "mode": 0 }, { "signatureId": 0012, "mode": 1 } ]}
预期处理结果
{ "signatures": [ { "signatureId": 0050, "mode": 0 }, { "signatureId": 0012, "mode": 0 } ]}
实现命令
方案1:简洁写法(不要求保留原顺序时使用)
如果不需要严格保留条目在原文件中的出现顺序,直接用JQ内置的unique_by函数即可,命令最短:
jq '.signatures |= unique_by(.signatureId)' input.json > deduplicated_output.json
命令执行后会自动按signatureId去重,每个ID仅保留一条记录。
方案2:保序写法(保留原文件条目顺序)
如果需要保留条目首次出现的顺序,不打乱原有排列,用reduce遍历实现去重:
jq '.signatures |= ( reduce .[] as $item ( {tracked: {}, list: []}; if .tracked[$item.signatureId | tostring] then . else .tracked[$item.signatureId | tostring] = true | .list += [$item] end ).list )' input.json > deduplicated_output.json
这个写法会按原顺序逐行遍历数组,第一次遇到某个signatureId时就把对应条目存入结果列表,后续遇到相同ID直接跳过,完全保留首次出现的条目内容和整体排序。
内容的提问来源于stack exchange,提问作者Yassine Boumajane
相关产品推荐
相关产品推荐

