Saltar al contenido

jq contar la cantidad de elementos en json por un específico key

Te sugerimos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

Aquí hay una solución (asumiendo que la entrada es un flujo de objetos JSON válidos) y que invoca jq con la opción -s:

map(ItemId: .Properties.ItmId)             # extract the ItmID values
| group_by(.ItemId)                          # group by "ItemId"
| map(ItemId: .[0].ItemId, Count: length)  # store the counts
| .[]                                        # convert to a stream

Un enfoque un poco más eficiente en la memoria sería usar inputs si tu jq lo tiene; pero en ese caso, use -n en lugar de -s, y reemplace la primera línea de arriba por: [inputs | ItemId: .Properties.ItmId ]

Solución eficiente

Las soluciones anteriores utilizan el integrado group_by, lo cual es conveniente pero conduce a ineficientes fácilmente evitables. Usando lo siguiente counter hace que sea fácil escribir una solución muy eficiente:

def counter(stream):
  reduce stream as $s (; .[$s|tostring] += 1);

Usando la opción de línea de comando -n, y se aplica de la siguiente manera:

counter(inputs | .Properties.ItmId)

esto lleva a un diccionario de cuentas:


  "1694738780": 1,
  "1347809133": 1

Tal diccionario es probablemente más útil que una secuencia de objetos singleton según lo previsto por el OP, pero si se necesita tal secuencia, se puede modificar lo anterior de la siguiente manera:

counter(inputs | .Properties.ItmId)
| to_entries[]
| ItemId: (.key), Count: .value

Usando el comando jq

cat json.txt | jq '.Properties .ItmId' | sort | uniq -c | awk -F " " 'print ""ItmId":" $2 ","count":" $1""'| jq .

Comentarios y puntuaciones

Agradecemos que quieras añadir valor a nuestro contenido informacional añadiendo tu experiencia en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *