首页 > 解决方案 > 对来自 2 个文件的 2 个 JSON 对象中的值求和

问题描述

我正在使用 jq 工具来合并 2 个 json 文件,但有一些重复的键,我希望重复的键将它们的值相加。

以下是文件:

文件1:

{
  "total": {
    "seconds": 1490
  },
  "days": {
    "2020-05-20": {
      "seconds": 1400
    },
    "2020-05-19": {
      "seconds": 30
    },
    "2020-05-18": {
      "seconds": 60
    }
  }
}

文件2:

{
  "total": {
    "seconds": 295
  },
  "days": {
    "2020-05-22": {
      "seconds": 120
    },
    "2020-05-21": {
      "seconds": 80
    },
    "2020-05-20": {
      "seconds": 95
    }
  }
}

预期输出:

{
  "total": {
    "seconds": 1785
  },
  "days": {
    "2020-05-22": {
      "seconds": 120
    },
    "2020-05-21": {
      "seconds": 80
    },
    "2020-05-20": {
      "seconds": 1495
    },
    "2020-05-19": {
      "seconds": 30
    },
    "2020-05-18": {
      "seconds": 60
    }
  }
}

我试过从这个命令开始,但不知道下一步该去哪里:

jq -s '.[0] * .[1]' file1 file2

标签: jsonsumjq

解决方案


下面的程序适用于您的示例,但如果您的实际输入中的对象具有其他非数字值的键,它将无法正常工作。

jq '. as $in |
reduce paths(numbers) as $p (input;
  setpath($p; getpath($p) + ($in | getpath($p))
)' file1 file2

在线演示


推荐阅读