JQ получает уникальные объекты и массивы на основе значения ключа

#json #object #jq

Вопрос:

Есть ли способ вернуть уникальный объект/массив при наличии дубликатов? Вот что я пытаюсь сделать.

У меня есть такая полезная нагрузка, как эта:

 {  "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"  }  ] }  

Как вы можете видеть, первые 2 полезные нагрузки идентичны, а последняя уникальна. Мне нужно получить уникальные объекты, а затем суммировать сумму, когда они упадут ниже определенного периода времени. Вот что у меня есть до сих пор

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

Что дает мне суммы, чтобы я мог их суммировать, но также содержит дубликаты. Что я хотел бы сделать, так это получить объекты, которые уникальны по своим .hash Идея состоит в том, чтобы суммировать общие суммы, которые попадают в указанную дату

Заранее спасибо

Ответ №1:

Что я хотел бы сделать, так это получить уникальные объекты по их хэшу .

Одним из способов удаления дубликатов было бы использование unique_by/1 в сочетании с параметром командной строки-s.

Предполагая, что вам нужны все элементы во всех массивах .data, с которых вы могли бы начать свой конвейер:

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

Однако, поскольку вас действительно интересуют только поля .метка времени и .сумма, было бы более эффективно действовать в следующих направлениях:

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