#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