
Datos de entrada.json
{
"lastUpdateTime" : "2018-07-20T10:56:26.000Z",
"items" : [ {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "dddd",
"size" : 5219402,
"rawSize" : 15658206,
"numFiles" : 119
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "aaaa",
"size" : 20524410845,
"rawSize" : 61573215663,
"numFiles" : 7540
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "wwww",
"size" : 0,
"rawSize" : 0,
"numFiles" : 2
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "qqqq",
"size" : 201084,
"rawSize" : 603252,
"numFiles" : 25
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "ttttt",
"size" : 280395332,
"rawSize" : 288900666,
"numFiles" : 199
} ]
}
Rendimiento esperado
User Size
aaa 121
bbb 123
¿Cómo convertir JSON a la tabla anterior? Por favor, ayúdame.
Respuesta1
Bueno, aunque estoy completamente de acuerdo con @gronostaj en cuanto a NO usar awk
o sed
como herramienta de análisis para JSON, sé que a veces puede haber casos en los que no se puede usar nada más excepto lo que viene con el sistema operativo.
Si está absolutamente seguro de que el JSON que publicó siempre estará en el mismo formato en el que publicó, la solución se encuentra a continuación:
#!/bin/sh
data='
{
"lastUpdateTime" : "2018-07-20T10:56:26.000Z",
"items" : [ {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "dddd",
"size" : 5219402,
"rawSize" : 15658206,
"numFiles" : 119
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "aaaa",
"size" : 20524410845,
"rawSize" : 61573215663,
"numFiles" : 7540
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "wwww",
"size" : 0,
"rawSize" : 0,
"numFiles" : 2
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "qqqq",
"size" : 201084,
"rawSize" : 603252,
"numFiles" : 25
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "ttttt",
"size" : 280395332,
"rawSize" : 288900666,
"numFiles" : 199
} ]
}
'
###########################################################
echo "${data}" | awk -F: 'BEGIN{
printf ("%s\t\t%s\t%s\n","Date", "User", "Size")
}
/lastUpdateTime/ {next}
/date/ { gsub(/\"|,|\s/,""); gsub(/T.+$/,""); printf ("%s\t", $2) }
/user/ { gsub(/\"|,|\s/,""); printf ("%s\t", $2) }
/size/ { gsub(/\"|,|\s/,""); printf ("%s\n", $2) }
'
Respuesta2
La única respuesta honestamente correcta es:
No.
awk
y sed
no son herramientas adecuadas para el trabajo. No podrá manejar adecuadamente el escape y la codificación JSON. Podría intentar cubrir algunos casos básicos, pero también podría utilizar una herramienta adecuada:jq.
jq
solución
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file
(como alternativa, puede canalizar JSON en el comando en lugar de leerlo desde el archivo)
Para alinear columnas:
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t