Извлечение значений из файла json с помощью jq

Как вывести значение после слов "игры", "игрушки", "книги"? Вот вывод jq '.' в файле:

  {
 "отчеты": [
 {
 «игры»: 3,
 "игрушки": 0,
 «книги»: 3,
 "кому": "2017-07-22T00:00:00.000+0000",
 "от": "2017-07-21T00:00:00.000+0000",
 "eventType": "забронировано",
 "имя_строки": "CWQ"
 },
 {
 "игры": 0,
 "игрушки": 0,
 "книги": 0,
 "кому": "2017-07-22T00:00:00.000+0000",
 "от": "2017-07-21T00:00:00.000+0000",
 "eventType": "забронировано",
 "rowName": "АНД"
 }
 ]
 }
 

Я пробовал с

{ echo "["; кошачий файл; эхо "]"; } | jq -r ' .[] | ( "\n" + .rowName + ":", "игры -> " + (.games | tostring), "игрушки -> " + (.toys | tostring), "книги -> " + (.books | tostring) )

Кажется, я делаю что-то не так.

ОБНОВЛЕНИЕ Насколько мне известно, если предположить, что в книгах есть еще 2 элемента: поставщик и имя :-?

jq -r '.reports |
.[] |
("\n" + .rowName + ":",
 "Games: " + (.games | tostring),
 "Toys: " + (.toys | tostring),
 .books | .[] |
 ("\n" + .name + ": ",
 "provider: " + (.provider | tostring) ) ) 
' response.json

Я получаю jq: error (at response.json:1): Не удается перебрать ноль (null)

0
21.08.2017, 11:00
3 ответа

Использование синтаксического анализатора командной строки JSON jq:

$ jq -r '.reports[] |          
         "\(.rowName) :",     
         "books -> \(.books)",
         "toys -> \(.toys)",  
         "games -> \(.games)\n"' input.json

CWQ:
books -> 3
toys -> 0
games -> 3

AED:
books -> 0
toys -> 0
games -> 0

Примечание. При этом используется интерполяция строк jqи выполняется итерация по всем записям в массиве report. , выбирая соответствующую информацию.


Обновление: обработка .booksкак массива объектов:

Учитывая

{
  "reports": [
    {
      "games": 3,
      "toys": 0,
      "books": [
        {
          "provider": "The provider",
          "name": "The name"
        }
      ],
      "to": "2017-07-22T00:00:00.000+0000",
      "from": "2017-07-21T00:00:00.000+0000",
      "eventType": "bookedIn",
      "rowName": "CWQ"
    },
    {
      "games": 0,
      "toys": 0,
      "books": [
        {
          "provider": "The 1st provider",
          "name": "The 1st name"
        },
        {
          "provider": "The 2nd provider",
          "name": "The 2nd name"
        }
      ],
      "to": "2017-07-22T00:00:00.000+0000",
      "from": "2017-07-21T00:00:00.000+0000",
      "eventType": "bookedOut",
      "rowName": "AED"
    }
  ]
}

Мы можем просто сделать

$ jq -r '.reports[] |
         "\(.rowName):",
         ( .books[] | "book name -> \(.name)",
                      "book provider -> \(.provider)" ),
         "toys -> \(.toys)",
         "games -> \(.games)\n"'

CWQ:
book name -> The name
book provider -> The provider
toys -> 0
games -> 3

AED:
book name -> The 1st name
book provider -> The 1st provider
book name -> The 2nd name
book provider -> The 2nd provider
toys -> 0
games -> 0
1
28.01.2020, 02:45
awk -v RS='[{},]' '/^"(games|toys|books)"/{ sub("^.*:",""); print; }' file
0
0
0
50
30
20
10
30
20

или всего одним словом:

awk -v pattern=games -v RS='[{},]' '$0 ~ "^\"" pattern "\"" { sub("^.*:",""); print; }' file
0
50
10
0
28.01.2020, 02:45

Давайте проанализируем этот JSON с помощью парсера JSON, .

jq -r '
    .reports |
    .[] |
    (
        "\n" + .rowName + ":",
        "games -> " + (.games | tostring),
        "toys -> "  + (.toys  | tostring),
        "books -> " + (.books | tostring)
    )
' file
CWQ:
games -> 3
toys -> 0
books -> 3

AED:
games -> 0
toys -> 0
books -> 0
0
28.01.2020, 02:45

Теги

Похожие вопросы