преобразование массива json в обычный массив с помощью jq - PullRequest
0 голосов
/ 15 апреля 2020
{
   "name": "ford",
   "availableVersions": [
      {
         "version": 111,
         "count": 3
      },
      {
         "version": 122,
         "count": 2
      },
      {
         "version": 133,
         "count": 3
      },
      {
         "version": 144,
         "count": 1
      }
                          ],
       "RealVersion": 155


}
{
   "name": "bmw",
   "availableVersions": [
     {
         "version": 244,
         "count": 1
     },
     {
      "version": 255,
      "count": 3
     }                  ],
     "RealVersion": 120

    }

У меня есть эта демонстрация. json файл сейчас if (name == 'ford') (имя может быть переменной) Я хочу получить все версии, у которых count != 3 и, если все версии count == 3, я хочу получить RealVersion ford, поэтому в этом случае вывод должен быть.

EXPECTED OUTPUT = [122 144 ] Я использую инструмент jq для разбора файла json

Теперь, если все версии рассчитываются == 3

      {
   "name": "ford",
   "availableVersions": [
      {
         "version": 111,
         "count": 3
      },
      {
         "version": 122,
         "count": 3
      },
      {
         "version": 133,
         "count": 3
      },
      {
         "version": 144,
         "count": 3
      }
                          ],
       "RealVersion": 155


}
{
   "name": "bmw",
   "availableVersions": [
     {
         "version": 244,
         "count": 1
     },
     {
      "version": 255,
      "count": 3
     }                  ],
     "RealVersion": 120

    }

Теперь в этом случае все версии версии == 3, поэтому теперь я хочу получить реальную версию 155 EXPECTED OUTPUT SHOULD BE 155

Я использую эту команду

    cat demo | jq  '.RealVersion as $RealVersion | select(.name == "bmw") | .availableVersions |  map(select(.count != 3)) |  if length > 0 then map(.version) else $RealVersion end'

, который работал нормально, но возвращает массив json, если имеется более одного элемента. Но я хочу сохранить его в обычном массиве. Я думаю, что если я не использую карту, то она будет работать. Я хочу вывод, чтобы я мог сохранить его в обычном массиве. Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 16 апреля 2020

Используя join и затем конкатенацию строк в конце, чтобы добавить скобки ...

jq --compact-output --raw-output '.RealVersion as $RealVersion | select(.name == "ford") | .availableVersions | map(select(.count != 3)) | if length > 0 then map(.version) else $RealVersion end | join (" ") | "[" + . + "]"'
[122 144]

Попробуйте онлайн!

Кроме того, поскольку вы, вероятно, не хотите жестко кодировать марку автомобиля, вы можете использовать --arg и сделать это переменной. Простой пример --arg

$ jq -n --arg brand "ford" '{"brand": $brand}'

{
  "brand": "ford"
}

(флаг -n просто говорит jq, что эта команда не использует ввод, потому что это простой пример)

Надеюсь, это поможет !

...