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

时间:2016-11-29 16:34:32

标签: json key counter jq

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

我能够使用此命令jq -s '[.[][]]' file*.json > combined_file.json合并两个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
  }
]

我一直在探索这个答案(How do I create an incremental index with jq),但我无法弄清楚如何让它发挥作用。

2 个答案:

答案 0 :(得分:3)

因此,如果你的目标是重新设置ID,你可以这样做:

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

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

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

答案 1 :(得分:0)

首先是slurp,然后连接(add),最后调整“id”值:

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

这种方法可以使用jq或更高版本的1.3版本(可能更早)。