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.
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'