You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:48:15