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.

¿Cómo se pasan múltiples valores como argumentos a una función utilizando jq?

Tengo un archivo json llamado test.json con el siguiente contenido:

[
{
“name”: “Akshay”,
“id”: “234”
},
{
“name”: “Amit”,
“id”: “28”
}
]

Tengo un script de shell con el siguiente contenido:

#!/bin/bash
function display
{
echo “name is $1 and id is $2”
}

cat test.json | jq ‘.[] | “(.name) (.id)”‘ | while read line; do display $line; done

Quiero que el nombre y la identificación de un único elemento se pasen juntos como argumentos a la función display, pero la salida se ve así:

name is “Akshay” and id is
name is “Amit” and id is
name is “234” and id is
name is “28” and id is

¿Cuál es la forma correcta de implementar el código?
PD: Específicamente quiero usar jq, así que por favor basa la respuesta en términos de jq.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que la expresión jq está mostrando el nombre y el id por separado, y el bucle while los está leyendo también por separado. Para solucionar esto, podemos modificar la expresión jq para que muestre un solo objeto JSON para cada elemento, que contenga tanto el nombre como el id. Así es cómo se vería el script modificado:

    #!/bin/bash
    function display
    {
      echo "el nombre es $1 y el id es $2"
    }
    
    cat test.json | jq '.[] | {name: .name, id: .id}' | while read line; do 
      name=$(echo $line | jq -r '.name')
      id=$(echo $line | jq -r '.id')
      display "$name" "$id"
    done
    

    Explicación:

    • La nueva expresión jq ‘.[] | {name: .name, id: .id}’ selecciona cada elemento del array y crea un nuevo objeto JSON para él, con nombre e id como propiedades.
    • El bucle while lee cada objeto JSON como una sola línea y utiliza jq nuevamente para extraer los valores de nombre e id como cadenas (la opción -r elimina las comillas que los envuelven).
    • La función display se llama con las dos cadenas como argumentos.

    Con esta modificación, la salida debería ser:

    el nombre es Akshay y el id es 234
    el nombre es Amit y el id es 28
    

Comments are closed.