una tabla objeto mostrar imprimir dinamica crear con colocar json bash jq

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