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

Я пытаюсь заменить значение ключа в моем исходном JSON значением объекта с соответствующим ключом в другом документе.

Это мои два файла: Файл 1:

{
    "-KaM0otlgWxXniYiacFe": {
        "-LNxx1IiX6oYTxJ4IXx2": true
    },
    "-KlJTvbfonIMI_-YfS5R": {
        "-LNxx1IbaB-yrZ623hrX": true
    }
}

Файл 2:

{
    "-KaM0otlgWxXniYiacFe": {
        "a": "-L-b__nH9PlMcz0stDDE",
        "b": "-L7ZNKSZy570TlrQUzHM",
        "c": "-Kaae3MsQUyViCKPs8Iv"
    },
    "-KlJTvbfonIMI_-YfS5R": {
        "a": "-LAlXKfUUTdYDeCZH-u-",
        "b": "-L7ZNKSTnob7w0HXjHr6",
    "    c": "-KYYicPD7VA9DEF_rus3"
    }
}

Цель состоит в том, чтобы создать 3 новых файла, в которых оригинальные ключи были заменены значениями a, b и c в каждом файле.

Желаемый результат при взгляде на «a»:

{
    "-L-b__nH9PlMcz0stDDE": {
        "-LNxx1IiX6oYTxJ4IXx2": true
    },
    "-LAlXKfUUTdYDeCZH-u-": {
        "-LNxx1IbaB-yrZ623hrX": true
    }
}

Я пытался использовать что-то вроде:

cat file1.json | jq --slurpfile file2 file2.json '| map(with_entries(.key = .file2[.key].a'

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

Любая помощь приветствуется.

Обновление:

Как мне обработать сценарий, в котором ключ из файла 1 можетне существует в файле 2, в результате чего «Невозможно использовать нуль (ноль) в качестве ключа объекта»?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Если у вас есть более чем тривиальное количество клавиш «a», «b», ..., и если вы не возражаете, если выходные файлы минимизированы, вы можете избежать множественных вызовов jq, используя подходздесь показано:

< file1.json jq -rc --argjson keys '["a", "b", "c"]' --argfile file2 <(file2) '
  $keys[] as $k 
  | ($k, (with_entries(.key |= $file2[.][$k]) ))
' | awk 'file {print > file ".json"; file=0; next} {file=$0}'

Вы можете пойти еще дальше и вычислить $keys программно, используя (например):

   [$file2[]][0]|keys_unsorted
0 голосов
/ 25 октября 2018

Как мне обработать сценарий, в котором ключ из файла 1 может не существовать в файле 2, что приводит к «Невозможно использовать нуль (ноль) в качестве ключа объекта»?

Наиболее очевидное, что можно сделать, это проверить, есть ли у объекта ключ:

with_entries(.key |= (if $file2[.]|has($k) then $file2[.][$k]  else . end))
0 голосов
/ 25 октября 2018

Не эксперт по jq, но вот что я придумал:

jq --arg k a --argfile file2 file2.json 'with_entries(.key |= $file2[.][$k])' file1.json > out_a.json

Изменить --arg k a и out_a.json для других ключей и выходных файлов.

...