Объединить имя и номер поля из файла JSON - PullRequest
1 голос
/ 04 апреля 2020
{
   "name": "ford",
   "availableVersions": [
      {
         "version": 111,
         "count": 3
      },
      {
         "version": 122,
         "count": 2
      },
      {
         "version": 133,
         "count": 3
      }
                          ],
       "RealVersion": 133


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

    }

У меня есть эта демонстрация. json файл сейчас if (count == 3) Я хочу объединить имя с версией.

Таким образом, мой вывод должен быть [ford:111,ford:133,BMW:155]. Я использую json синтаксический анализ с jq.

Я использовал эту команду, которая работала нормально

cat demo2| jq '.name + ": " + (.availableVersions[]|select(.count == 3).version|tostring)'

Но теперь я также хочу еще одно условие if (count ==3 and version != RealVersion), тогда только я хочу version Я пробовал много команд, ни одна из них не работает. Может ли кто-нибудь помочь мне с этим?

Итак, ОЖИДАЕМЫЙ ВЫХОД = [ford:111,BMW:155] Таким образом, ford:133 не будет поступать в вывод

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Вот способ, который захватывает .RealVersion с as ранее в фильтре, а затем использует его в select.

.name + ": " + (
    .RealVersion as $r
  | .availableVersions[]
  | select(.count == 3 and .version != $r).version 
  | tostring
)

Пример вывода

"ford: 111"
"bmw: 155"

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

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

Преобразование нескольких входных «BLOB-объектов» в один выходной BLOB-объект требует -s | --slurp, что не очень эффективно для использования памяти. Пожалуйста, убедитесь, что это требование, прежде чем его реализовать.

jq --compact --slurp '
    .[] |= . as $r
        | .availableVersions[]
        | select(.count == 3 and .version != $r.RealVersion)
        | "\($r.name):\(.version)"
'

Вывод:

["ford:111","bmw:155"]
...