Как отфильтровать и заменить значения в JSON с JQ - PullRequest
1 голос
/ 08 ноября 2019

У меня проблемы с фильтрацией и обновлением содержимого файла json с использованием jq. Мне нужно отфильтровать данные JSON на основе определенных значений и на основе этого фильтра редактировать другие значения и увеличивать другие

Я пытался использовать

jq '.[] | select (."name"| contains("CHANNEL1"))' 

для фильтрации, но в результате отсутствуетверхняя клавиша "x-ID.0" info, результат следующий:

{
  "_file.name": "filename.ext",
  "name": "CHANNEL1 HD TV",
  "logo": "file.png",
  "x-channelID": "726"
}
{
  "_file.m3u.name": "filename.ext",
  "name": "CHANNEL1 SD",
  "logo": "file.png",
  "x-channelID": "726"
}

Для перенумерации я проверил функцию ниже, и она хорошо работает

jq -n -s '[ foreach inputs[] as $i (100; .+1; $i*{"x-channelID":(.-1)}) ]'

Воторигинальный файл json

{
  "x-ID.0": {
    "_file.name": "filename.ext",
    "name": "CHANNEL1 HD TV",
    "logo": "file.png",
    "x-channelID": "726"
  },
   "x-ID.2": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL2",
    "logo": "file.png",
    "x-channelID": "106"
  },
   "x-ID.3": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL3 SD",
    "logo": "file.png",
    "x-channelID": "236"
  },
   "x-ID.4": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 SD",
    "logo": "file.png",
    "x-channelID": "726"
  },
   "x-ID.5": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL2 HD",
    "logo": "file.png",
    "x-channelID": "726"
  }
}

вот ожидаемый результат

{
  "x-ID.0": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 HD",
    "logo": "CHANNEL1.png",
    "x-channelID": "100"
  },
   "x-ID.4": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 SD",
    "logo": "CHANNEL1.png",
    "x-channelID": "101"
  }
}

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете использовать следующее:

to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries

to_entries отобразить ваш объект в массив { key: "key", value: "value" } элементов.

map(select(filter)) фильтрует тех, чье значение соответствует вашим критериям.

Затем мы используем foreach для увеличения счетчика, пока мы перебираем оставшиеся пары ключ / значение и обновляем поле x-channelIDзначений со счетчиком.

Наконец, мы используем from_entries для воссоздания нужного объекта из массива пар ключ / значение.

Вы можете попробовать его здесь .

...