
Входные данные.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
} ]
}
Ожидаемый результат
User Size
aaa 121
bbb 123
Как преобразовать JSON в таблицу выше? Пожалуйста, помогите мне.
решение1
Что ж, хотя я полностью согласен с @gronostaj относительно того, что НЕ СЛЕДУЕТ использовать awk
или sed
в качестве инструмента для анализа JSON, я знаю, что иногда могут быть случаи, когда вы не можете использовать ничего другого, кроме того, что поставляется с ОС.
Если вы абсолютно уверены, что отправленный вами JSON всегда будет в том же формате, в котором вы его опубликовали, то решение ниже:
#!/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) }
'
решение2
Единственный честно правильный ответ:
Не.
awk
и sed
не являются подходящими инструментами для работы. Вы не сможете должным образом справиться с экранированием и кодированием JSON. Вы можете попытаться охватить некоторые базовые случаи, но вы также можете просто использовать правильный инструмент:jq.
jq
решение
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file
(в качестве альтернативы вы можете передать JSON в команду вместо того, чтобы читать его из файла)
Чтобы выровнять столбцы:
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t