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.