尝试合并两个 JSON 文件并重置 ID 值将其替换为新的递增值

Trying to merge two JSON file and reset ID values replace it with new incrementing values

我一直在玩弄 jq (https://stedolan.github.io/jq/),但我似乎无法让它按照我想要的方式工作。

我能够使用此命令合并两个 JSON 文件 jq -s '[.[][]]' file*.json > combined_file.json 现在,我不知道如何递增 'id' 值,因为当我合并它时会有重复的 id 值。

我的 json 文件看起来像这样:

file_a.json

[  {
    "id": 0,
    "fruit_name": "Apple",
    "fruit_category": "category 1",
    "fruit_count": 1
  },
  {
    "id": 1,
    "fruit_name": "Apricot",
    "fruit_category": "category 2",
    "fruit_count": 1
  },
  {
    "id": 2,
    "fruit_name": "Avocado",
    "fruit_category": "category 3",
    "fruit_count": 2
  }
]

file_b.json

[  {
    "id": 0,
    "fruit_name": "Banana",
    "fruit_category": "category 4",
    "fruit_count": 1
  },
  {
    "id": 1,
    "fruit_name": "Bilberry",
    "fruit_category": "category 5",
    "fruit_count": 1
  },
  {
    "id": 2,
    "fruit_name": "Blackberry",
    "fruit_category": "category 6",
    "fruit_count": 2
  }
]

我一直在探索这个答案 (),但我无法弄清楚如何让它发挥作用。

因此,如果您的目标是重新播种 ID,您可以这样做:

$ jq -n '[ foreach inputs[] as $i (0; .+1; $i*{id:(.-1)}) ]' file_?.json

我发现使用 inputs 而不是 slurping 更容易处理多个输入。

想法是从输入中获取每个项目并更新 ID(通过与具有所需 ID 的对象合并)。

先slurp,再concatenate(add),最后调整"id"值:

$ jq -s 'add | reduce range(0;length) as $n (.; .[$n].id = $n)' file_?.json

此方法适用于 jq 1.3 版或更高版本(可能更早)。