Как назначить несколько значений для шаблона. json с использованием сценариев jq & bash? - PullRequest
1 голос
/ 06 января 2020

У меня есть файл, который содержит строки значений для "name", "profile", "os". Я создал bash скрипт, который организует значения в нужном мне формате. У меня уже есть шаблон с другими значениями, которые я буду использовать (см. Ниже). Используя jq (если это возможно), как я могу заменить старые значения новыми?

Файл (ii. json):

Mark,controller-install,installed
Chris,controller-install,installed

TEPMLATE:

{
  "name": "jeff",
  "profile": "worker-install",
  "selector": {
    "mac": "4c:pc:ef:4d:33:29",
    "os": "n/a"
  }
}

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Является ли ваш шаблон файлом, который вы передаете? Или это просто общая структура? Вы можете прочитать файл (csv) raw, разделить запятыми и сгенерировать json.

$ jq -R '
split(",") as [$name, $profile, $os]
  | {$name, $profile: selector: {mac: "4c:pc:ef:4d:33:29", $os}}
' input.csv

В противном случае загрузите шаблон и при необходимости обновите поля. Вы можете обновить их по отдельности или просто объединить.

$ jq -R --argfile template template.json '
split(",") as [$name, $profile, $os]
  | $template * {$name, $profile, selector: {$os}}
' input.csv
0 голосов
/ 07 января 2020

Решение «чистого jq»:

    jq -R —-argfile template template.json ’
      split(",") as [$name,$profile,$os],
      | $template
      | .name = $name 
      | .profile = $profile
      | .selector.os = $os' ii.json

Это предполагает bash или bash -подобную оболочку. Как правило, помещение jq-программы в файл и запуск jq с параметром -f может быть способом go.

.
0 голосов
/ 07 января 2020

Не могли бы вы попробовать:

while IFS="," read -r name profile os; do
    jq ".name = \"$name\" | .profile = \"$profile\" | .selector.os = \"$os\"" < template.json
done < ii.json

Вывод:

{
  "name": "Mark",
  "profile": "controller-install",
  "selector": {
    "mac": "4c:pc:ef:4d:33:29",
    "os": "installed"
  }
}
{
  "name": "Chris",
  "profile": "controller-install",
  "selector": {
    "mac": "4c:pc:ef:4d:33:29",
    "os": "installed"
  }
}

Надеюсь, он соответствует вашим требованиям.

...