es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JQ obtener objetos y arreglos únicos basados en el valor clave.

¿Hay alguna manera de devolver un objeto/array único cuando existen duplicados? Esto es lo que estoy intentando hacer.

Tengo un payload como este:

{
“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”
}
]
}

Como puedes ver, los primeros 2 payloads son idénticos y el último es único. Necesito obtener los objetos únicos y luego sumar la .amount cuando caen por debajo de un cierto período de tiempo. Esto es lo que tengo hasta ahora:

jq –arg this “$(date +%Y-%m-%dT%H:%M:%S)” ‘.data[] | select(.timestamp >= $this) | .amount’

Lo cual me da las cantidades para que pueda sumarlas, pero también contiene los duplicados. Lo que me gustaría hacer es obtener los objetos que son únicos por su .hash. La idea es sumar las cantidades totales que caen dentro de la fecha dada.

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¡Puede usar la función group_by en jq para agrupar los objetos por su .hash y luego seleccionar los objetos únicos. Aquí hay un ejemplo:


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

    Esto devolverá una matriz de objetos únicos que caen dentro de la fecha dada. Luego puede usar la función map para sumar el .cantidad de cada objeto.


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

Comments are closed.