Как объединить данные в файле JSON, используя в качестве совпадения содержимое? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть текстовый файл, который содержит следующий вывод JSON. Я хотел бы иметь возможность объединять данные всякий раз, когда "IP" содержится в группах. Я хотел бы использовать jq или sed / awk. Я открыт для любых других команд bash.

{"Front":[
{"Name":"new.domain.com-80", "Out":"8.8.8.8", "In":"192.168.2.2:80", "W Name":"new.domain.com-80", "Groups":"192.168.3.29:80 192.168.3.30:80"},
{"Name":"new.domain.com -443", "Out":"8.8.8.8", "In":"192.168.2.2:443", "W Name":"new.domain.com-443", "Groups":"192.168.3.29:443 192.168.3.30:443"}
]}
{"Back":[
{"REC":"", "IP":"192.168.3.30", "Host":"new2.domain.com", "Info":"Worker5 MD: Data source - Owner: Q"},
{"REC":"Q", "IP":"192.168.3.29", "Host":"new3.domain.com", "Info":"Worker5 MD: Data source - Owner: Q"},
{"REC":"Q"}
]}

Если IP содержится в группах, добавьте Host & Info. Мы можем игнорировать RE C

Ожидаемый результат:

{"Front":[
{"Name":"new.domain.com-80", "Out":"8.8.8.8", "In":"192.168.2.2:80", "W Name":"new.domain.com-80", "Groups":"192.168.3.29:80 192.168.3.30:80", "Host":"new2.domain.com,new3.domain.com", "Info":"Worker5 MD: Data source - Owner: Q,Worker5 MD: Data source - Owner: Q"},
{"Name":"new.domain.com-443", "Out":"8.8.8.8", "In":"192.168.2.2:443", "W Name":"new.domain.com-443", "Groups":"192.168.3.29:443 192.168.3.30:443", "Host":"new2.domain.com,new3.domain.com", "Info":"Worker5 MD: Data source - Owner: Q,Worker5 MD: Data source - Owner: Q"}
]}

1 Ответ

2 голосов
/ 17 марта 2020

Далее предполагается, что объекты Front и Back представлены в этом порядке на STDIN или в файле; с этим допущением следует вызывать следующую программу с параметром командной строки -n.

input as $front
| input as $back
| ($back|INDEX(.Back[]; .IP) | map_values({Host,Info})) as $dict
| $front
| .Front[]
  |= reduce ($dict | keys_unsorted[]) as $k (.;
       if (.Groups | contains($k)) then . + $dict[$k] else . end)

Я использовал reduce для перебора значений IP, поскольку это обеспечивает гибкость в случае, если вы хотите для обработки конфликтов определенным образом.

Вызов

Одна возможность:

jq -n -f program.jq input.json
...