viernes, marzo 06, 2020

Recetas de uso de jq

jq es una utilidad de línea de comandos cuya misión es procesar flujos de datos en json, con la misma facilidad y potencia que ofrecen utilidades como sed o awk para procesar ficheros de texto. El autor de tiene publicado un excelente manual (enlace a la versión 1.5) sobre como usarlo.

Esta va a ser una de esas entradas dinámicas, donde quiero ir anotando como hacer ciertas tareas con jq. Puesto que no es una utilidad que uso todos los días, no me se la sintaxis de memoria, pero de vez en cuando necesito realizar ciertas operaciones y no me acuerdo exactamente sintaxis y como hacerla. Así que he decido hacer esta entrada de recetas de uso de jq. Espero que os sirva

Índice


Modificar el valor de una clave en un array

Supongamos que tenemos un array de objetos JSON y queremos realizar cierta operación matemática con el valor de una de sus clave. Por ejemplo supongamos que tenemos el siguiente array de objetos json en nel fichero ejemplo1.json y queremos modificar el valor de cada clave "key" en cada objeto dividiéndola por 1000. Además, queremos pasar a mayúsculas el valor de la clave value. Queremos después de la operación generar un array resultante.

{
  "result": [
    {
      "time": 1000,
      "value": "Uno"
    },
    {
      "time": 2000,
      "value": "Dos"
    },
    {
      "time": 3000,
      "value": "Tres"
    }
  ]
}

Si el fichero json anterior es ejemplo1.json , se podría realizar la operación con jq de la siguiente manera:

cat ejemplo1.json | jq  -r '.result[]|{time:(.time/1000), value:.value|ascii_upcase}'| jq --slurp .

El resultado de la operación será el siguiente:

[
  {
    "time": 1,
    "value": "UNO"
  },
  {
    "time": 2,
    "value": "DOS"
  },
  {
    "time": 3,
    "value": "TRES"
  }
]


Unir varias líneas con objetos json en un array

Supongamos que tenemos un fichero donde cada línea es un objecto json válido. Por ejemplo, el fichero datos.txt tiene:

{"key": "1", "value": "val1"}
{"key": "2", "value": "val2"}
{"key": "3", "value": "val3"}

Ahora, queremos formar un sólo objeto json que sea un array y donde cada uno de los elementos sea el objecto json que está en cada línea. Pues para ello se usa la opción -s o --slurp:

jq -s < datos.txt

Y este es el resultado que se obtiene:
[
  {
    "key": "1",
    "value": "val1"
  },
  {
    "key": "2",
    "value": "val2"
  },
  {
    "key": "3",
    "value": "val3"
  }
]

No hay comentarios: