如何使用contains作为匹配项合并JSON文件中的数据?

如何使用contains作为匹配项合并JSON文件中的数据?,json,jq,Json,Jq,我有一个文本文件,其中包含以下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

我有一个文本文件,其中包含以下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包含在组中,则添加主机和信息。 我们可以忽略REC

预期产出:

{"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"}
]}

以下假设前面和后面的对象在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

为什么
组中的IP地址不存储为数组?为什么
“组”:“192.168.3.29:80 192.168.3.30:80”
而不是
“组”:[“192.168.3.29:80”,“192.168.3.30:80”
?这只是格式化输出的一部分。如果这有帮助的话,我可以改变。前面的两个组都有192.168.3.29,我们怎么知道合并哪一个?请写出您的上述评论,使用jq是没有帮助的,在另一个脚本中检查字符串的包含比在数组中更容易。如果包含项上有匹配项,则需要将其添加到这两个脚本中。这没关系。这样我们就失去了
new2.domain.com
您假设对象以该格式列出并带有文本文件是正确的。你能帮我理解如何运行这个吗?这是我正在使用的文件,我得到jq:error:INDEX/2没有定义在第3行:|($Back | INDEX(.Back[].IP)| map_值({Host,Info}))作为$dict jq:1编译错误你的jq显然很旧了。如果您不能立即升级,那么谷歌搜索INDEX/2的def并将其复制到program.jq的顶部(例如,谷歌搜索:def INDEX builtin.jq)谢谢@peak,我能够让您的程序使用Kali运行。正如oguz ismail指出的那样,new2.domain.com确实会被改写。不管怎样,为了保存它?是的。这取决于你想要什么。