基于键值获取唯一的对象和数组。

3

当存在重复数据时,是否有一种方法可以返回唯一的对象/数组?这是我想要做的事情。

我有一个这样的有效载荷:

{
  "data": [
    {
      "account": "12xUoMKwf12ABjNx4VCvYcNkX79gW1kzz2JnBLxkFbjswRczRvM",
      "amount": 7885016,
      "block": 470788,
      "gateway": "113kQU96zqePySTahB7PEde9ZpoWK76DYK1f57wyhjhXCBoAu88",
      "hash": "DTU1GGfR0eU15hv6KiV_bg6FOJXfUWz4TjIq1H7TGy4",
      "timestamp": "2020-08-28T01:29:46.000000Z"
    }
  ]
}
{
  "data": [
    {
      "account": "12xUoMKwf12ABjNx4VCvYcNkX79gW1kzz2JnBLxkFbjswRczRvM",
      "amount": 7885016,
      "block": 470788,
      "gateway": "113kQU96zqePySTahB7PEde9ZpoWK76DYK1f57wyhjhXCBoAu88",
      "hash": "DTU1GGfR0eU15hv6KiV_bg6FOJXfUWz4TjIq1H7TGy4",
      "timestamp": "2020-08-28T01:29:46.000000Z"
    }
  ]
}
{
  "data": [
    {
      "account": "12xUoMKwf12ABjNx4VCvYcNkX79gW1kzz2JnBLxkFbjswRczRvM",
      "amount": 8623955,
      "block": 470509,
      "gateway": "113kQU96zqePySTahB7PEde9ZpoWK76DYK1f57wyhjhXCBoAu88",
      "hash": "5fQJY9MprH9b3IstVU1SdfBteUWoF_sdsVuiARPBtTY",
      "timestamp": "2020-08-27T19:01:48.000000Z"
    }
  ]
}

正如您所看到的,前两个有效载荷是相同的,而最后一个是唯一的。我需要获取唯一的对象,然后在它们的时间周期低于某个特定时间时求和 .amount。以下是我目前拥有的内容:

jq --arg this "$(date +%Y-%m-%dT%H:%M:%S)" '.data[] | select(.timestamp >= $this) | .amount'

这让我得到了数量,所以我可以把它们加起来,但是也包含了重复的。我想要做的是通过它们的.hash获取唯一的对象。目标是总结给定日期内的总金额。

提前感谢!

1个回答

3

我想做的是获取由其 .hash 唯一的对象。

消除重复项的一种方法是使用 unique_by/1 与 -s 命令行选项结合使用。

假设您希望获取所有 .data 数组中的所有项目,您可以从以下内容开始:

jq -s 'map(.data[]) | unique_by(.hash) ...' 

然而,由于你只对.timestamp和.amount字段感兴趣,因此按照以下方式进行操作会更加高效:

jq -s --arg this "$(date +%Y-%m-%dT%H:%M:%S)" '
  map(.data[] | select(.timestamp >= $this) | {hash, amount})
  | unique_by(.hash)[]
  | .amount
' input.json



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接