JQ обновить содержимое одного файла в другой в качестве значения ключа - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь обновить значения branch.json.branch2 из значения branch2.json.Employes Используя jq, Как я могу объединить содержимое одного файла в другой файл? Ниже приведены файлы

Я пробовал это, ноэто сработало, просто печатает исходные данные без обновления сведений

#!/bin/sh
#call file with branch name for example ./update.sh branch2
set -xe
branchName=$1
fullPath=`pwd`/$1".json"
list=$(cat ${fullPath})
branchDetails=$(echo ${list} | /usr/local/bin/jq -r '.Employes')
newJson=$(cat branches.json | 
      jq --arg updateKey "$1" --arg updateValue "$branchDetails" 'to_entries | 
       map(if .key == "$updateKey"
          then . + {"value":"$updateValue"} 
          else . 
          end) | 
          from_entries')

echo $ newJson &> results.json

branch1.json

{
  "Employes": [
    {
      "Name": "Ikon",
      "age": "30"
    },
    {
      "Name": "Lenon",
      "age": "35"
    }
  ]
}

branch2.json

{
  "Employes": [
    {
      "Name": "Ken",
      "age": "40"
    },
    {
      "Name": "Frank",
      "age": "23"
    }
  ]
}

brances.json / results.json fromat

{
  "branch1": [
      {
        "Name": "Ikon",
        "age": "30"
      },
      {
        "Name": "Lenon",
        "age": "35"
      }
    ],
  "branch2": [
      {
        "Name": "Ken",
        "age": "40"
      },
      {
        "Name": "Frank",
        "age": "23"
      }
    ]

}

Примечание. У меня нет списка всех файлов ветвлений в любой заданной точке, поэтому скрипт отвечает только за обновление сведений об этой ветке.

1 Ответ

0 голосов
/ 28 мая 2018

Если имя файла - это имя свойства, которое вы хотите обновить, вы можете использовать input_filename для выбора файлов.Тестирование не требуется, просто передайте файлы, которые вы хотите обновить.Просто помните о порядке передачи входных файлов.

Объедините содержимое файла так, как считаете нужным.Чтобы просто заменить, просто сделайте простое назначение.

$ jq 'reduce inputs as $i (.;
    .[input_filename|rtrimstr(".json")] = $i.Employes
)' branches.json branch{1,2}.json

Ваш сценарий просто должен быть:

#!/bin/sh
#call file with branch name for example ./update.sh branch2
set -xe
branchName=$1
newJson=$(jq 'reduce inputs as $i (.; .[input_filename|rtrimstr(".json")] = $i.Employees)' branches.json "$branchName.json")
...