Входные данные.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 в приведенную выше таблицу? Пожалуйста, помогите мне.

2 ответа2

4

Единственно честный правильный ответ:

Не.

awk и sed не являются подходящими инструментами для работы. Вы не сможете должным образом справиться с экранированием и кодировкой JSON. Вы можете попытаться охватить некоторые базовые случаи, но вы также можете просто использовать подходящий инструмент: jq.

решение jq

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file

(в качестве альтернативы вы можете передать JSON в команду вместо чтения из файла)

Чтобы выровнять столбцы:

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t
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) }
'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .