JQ Группировка по ключу, значение слияния, затем выравнивание объекта - PullRequest
0 голосов
/ 04 марта 2019

Со следующими входами:

# file1.json
{
  "uid": "1",
  "name": "jack"
}
{
  "uid": "2",
  "name": "jill"
}

# file2.json
{
  "fid": "a",
  "file": "sample1.txt",
  "uid": "1"
}
{
  "fid": "b",
  "file": "sample2.txt",
  "uid": "1"
}
{
  "fid": "c",
  "file": "sample3.txt",
  "uid": "2"
}

Как мне вставить пару ключ-значение name в объект в file2.json.Вывод, который я пытаюсь получить, выглядит следующим образом:

{
  "fid": "a",
  "file": "sample1.txt",
  "uid": "1",
  "name": "jack"
}
{
  "fid": "b",
  "file": "sample2.txt",
  "uid": "1",
  "name": "jack"
}
{
  "fid": "c",
  "file": "sample3.txt",
  "uid": "2",
  "name": "jill"
}

Решения, размещенные на объединяют объекты json с jq и , объединяют два файла json на основе общего ключа с помощью утилиты jqили альтернативный способ из командной строки , кажется, оба возвращают только последнюю подходящую пару.Смотри ниже.

{"uid":"1","name":"jack","fid":"b","file":"sample2.txt"}
{"uid":"2","name":"jill","fid":"c","file":"sample3.txt"}

1 Ответ

0 голосов
/ 04 марта 2019

Вам нужно будет "slurp" file1.json, например, вызвав jq следующим образом:

jq -n -f merge.jq --slurpfile file1 file1.json file2.json

, где merge.jq содержит:

INDEX($file1[]; .uid) as $dict
| inputs
| . + $dict[.uid]

def INDEX

Если у вашего jq нет INDEX / 2, просто добавьте его def:

def INDEX(stream; idx_expr):
  reduce stream as $row ({}; .[$row|idx_expr|tostring] = $row);
...