jq:使用“插入”的条件插入;查阅“&&引用;“目标”;JSON对象

jq:使用“插入”的条件插入;查阅“&&引用;“目标”;JSON对象,json,jq,Json,Jq,我正在尝试改进我使用jq(Python版本)编写的bash脚本,但无法完全实现手头任务的条件性质 任务:仅当“查找”的键与“目标”中的特定“更高级别”值匹配时,才将数组从一个JSON对象(“查找”)插入另一个(“目标”)。假设这两个JSON对象分别位于lookup.JSON和target.JSON中 让这一点更清楚的一个简单示例: “查找”JSON: { “表1”:[ “a_col_1”, “a_col_2” ], “表二”:[ “b_col_1”, “b_col_2”, “b_col_3” ]

我正在尝试改进我使用
jq
(Python版本)编写的bash脚本,但无法完全实现手头任务的条件性质

任务:仅当“查找”的键与“目标”中的特定“更高级别”值匹配时,才将数组从一个JSON对象(“查找”)插入另一个(“目标”)。假设这两个JSON对象分别位于
lookup.JSON
target.JSON

让这一点更清楚的一个简单示例:

“查找”JSON:

{
“表1”:[
“a_col_1”,
“a_col_2”
],
“表二”:[
“b_col_1”,
“b_col_2”,
“b_col_3”
]
}
“目标”JSON:

{
“顶级”:[
{
“名称”:“表1”,
“测试”:[
{
“测试1”:{
“参数1”:“某些参数”
}
},
{
“测试2”:{
“参数1”:“另一个参数”
}
}]
},
{
“名称”:“表二”,
“测试”:[
{
“测试1”:{
“参数1”:“某些参数”
}
},
{
“测试2”:{
“参数1”:“另一个参数”
}
}
]
}
]
}
我希望输出为:

{
“顶级”:[{
“名称”:“表1”,
“测试”:[{
“测试1”:{
“参数1”:“某些参数”
}
},
{
“测试2”:{
“参数1”:“另一个参数”,
“参数2”:[
“a_col_1”,
“a_col_2”
]
}
},
{
“名称”:“表二”,
“测试”:[{
“测试1”:{
“参数1”:“某些参数”
}
},
{
“测试2”:{
“参数1”:“另一个参数”,
“参数2”:[
“b_col_1”,
“b_col_2”,
“b_col_3”
]
}
}
]
}
]
}
]
}
希望这是有道理的。早期的尝试使两个JSON blob都发出咕噜声,并将它们分配给两个变量。我正在尝试在[rough]
($lookup | keys[])==$target.top_level.name
上选择匹配项,但我无法完全使此匹配项或随后的数组插入工作


任何建议都会受到欢迎

假设JSON示例已更正,并且以下程序位于文件“target.jq”中,则调用:

jq --argfile lookup lookup.json -f target.jq target.json
产生预期的结果

target.jq 警告
由于
--argfile
已被正式弃用,您可能希望选择另一种传递lookup.json内容的方法,但是
--argfile
在撰写本文时,jq的所有现有版本都支持它。

假设json示例已被更正,并且以下程序位于文件“target.jq”中,调用:

jq --argfile lookup lookup.json -f target.jq target.json
产生预期的结果

target.jq 警告 由于
--argfile
已被正式弃用,您可能希望选择另一种传递lookup.json内容的方法,但是
--argfile
在撰写本文时受到jq所有现有版本的支持。

jq答案已经给出,但是ask本身非常吸引人——它需要从源文件到插入的文件进行交叉查找,因此我忍不住提供了一个使用jtc实用程序的替代解决方案:

<target.json jtc -w'<name>l:<N>v[-1][tests][-1:][0]' \
                 -i file.json -i'<N>t:' -T'{"param_2":{{}}}'
已经给出了jq的答案,但是ask本身非常吸引人-它需要从源文件到插入的文件进行交叉查找,因此我忍不住使用
jtc
实用程序提供了另一种解决方案:

<target.json jtc -w'<name>l:<N>v[-1][tests][-1:][0]' \
                 -i file.json -i'<N>t:' -T'{"param_2":{{}}}'

啊,谢谢,@peak。让我试着实现这一点。至于传入
lookup.json
的内容,我能不能不传入这两个文件并分配给变量以进行相应的处理:
jq-s.[0]作为$lookup |[1]作为$target |…'lookup.json target.json
?可以,但为什么要麻烦呢?哦,我想这会降低以后困扰我的
--argfile
不推荐的风险。使用-s也会带来麻烦。是的,正如我所了解的那样,您不能将您的解决方案用于
-s
。啊,谢谢,@peak。让我试着实现这一点。至于传入
lookup.json
的内容,我能不能不传入这两个文件并分配给变量以进行相应的处理:
jq-s.[0]作为$lookup |[1]作为$target |…'lookup.json target.json
?可以,但为什么要麻烦呢?哦,我想这会降低以后困扰我的
--argfile
不推荐的风险。使用-s也会带来麻烦。是的,正如我所了解的那样,您不能将您的解决方案用于
-s