objeto - ¿Cómo formatear una cadena JSON como una tabla usando jq?
mostrar objeto json en html (3)
¿Por qué no algo como:
echo ''[{
"name": "George",
"id": 12,
"email": "[email protected]"
}, {
"name": "Jack",
"id": 18,
"email": "[email protected]"
}, {
"name": "Joe",
"id": 19,
"email": "[email protected]"
}]'' | jq -r ''.[] | "/(.id)/t/(.name)"''
Salida
12 George
18 Jack
19 Joe
Edición 1: para el formato de grano fino, utilice herramientas como awk
echo ''[{
"name": "George",
"id": 12,
"email": "[email protected]"
}, {
"name": "Jack",
"id": 18,
"email": "[email protected]"
}, {
"name": "Joe",
"id": 19,
"email": "[email protected]"
}]'' | jq -r ''.[] | [.id, .name] | @csv'' | awk -v FS="," ''BEGIN{print "ID/tName";print "============"}{printf "%s/t%s%s",$1,$2,ORS}''
ID Name
============
12 "George"
18 "Jack"
19 "Joe"
Edit 2: En respuesta a
¿No hay manera de que pueda obtener una variable que contenga una matriz directamente desde jq?
Por qué no?
Un ejemplo poco involucrado (de hecho, modificado desde el suyo) donde el correo electrónico se cambia a una matriz lo demuestra
echo ''[{
"name": "George",
"id": 20,
"email": [ "[email protected]" , "[email protected]" ]
}, {
"name": "Jack",
"id": 18,
"email": [ "[email protected]" , "[email protected]" ]
}, {
"name": "Joe",
"id": 19,
"email": [ "[email protected]" ]
}]'' | jq -r ''.[] | .email''
Salida
[
"[email protected]",
"[email protected]"
]
[
"[email protected]",
"[email protected]"
]
[
"[email protected]"
]
Simplemente comencé con Bash scripting y tropecé con jq para trabajar con JSON.
Necesito transformar una cadena JSON como abajo en una tabla para la salida en el terminal.
[{
"name": "George",
"id": 12,
"email": "[email protected]"
}, {
"name": "Jack",
"id": 18,
"email": "[email protected]"
}, {
"name": "Joe",
"id": 19,
"email": "[email protected]"
}]
Lo que quiero mostrar en el terminal:
ID Name
=================
12 George
18 Jack
19 Joe
Tenga en cuenta que no quiero mostrar la propiedad de correo electrónico para cada fila, por lo que el comando jq debe incluir algún filtrado. Lo siguiente me da una lista simple de nombres e identificadores:
list=$(echo "$data" | jq -r ''.[] | .name, .id'')
printf "$list"
El problema con eso es que no puedo mostrarlo como una tabla. Sé que jq tiene algunas opciones de formato, pero no tanto como las opciones que tengo cuando uso printf
. Creo que quiero obtener estos valores en una matriz que luego puedo recorrer para hacer el formateo ... Las cosas que probé me dieron resultados variables, pero nunca lo que realmente quiero.
¿Alguien me puede apuntar en la dirección correcta?
Si los valores no contienen espacios, esto podría ser útil:
read -r -a data <<<''name1 value1 name2 value2''
echo "name value"
echo "=========="
for ((i=0; i<${#data[@]}; i+=2)); do
echo ${data[$i]} ${data[$((i+1))]}
done
Salida
name value
==========
name1 value1
name2 value2
Usar el filtro @tsv
tiene mucho que recomendarlo, principalmente porque maneja numerosos "casos de borde" de una manera estándar:
.[] | [.id, .name] | @tsv
Añadiendo los encabezados se puede hacer así:
jq -r ''["ID","NAME"], ["--","------"], (.[] | [.id, .name]) | @tsv''
El resultado:
ID NAME
-- ------
12 George
18 Jack
19 Joe