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
。