考虑文件“ b.json”:
[
{
"id": 3,
"foo": "cannot be replaced, id isn't in a.json, stay untouched",
"baz": "do not touch3"
},
{
"id": 2,
"foo": "should be replaced with 'foo new2'",
"baz": "do not touch2"
}
]
和'a.json':
[
{
"id": 2,
"foo": "foo new2",
"baz": "don't care"
}
]
我想使用jq和来自a.json的匹配值来更新b.json中的键“ foo”。它也应该与a.json中的多个条目一起使用。
因此,所需的输出为:
[
{
"id": 3,
"foo": "cannot be replaced, id isn't in a.json, stay untouched",
"baz": "do not touch3"
},
{
"id": 2,
"foo": "foo new2",
"baz": "do not touch2"
}
]
这是使用的几种可能性之一INDEX/2
。如果您的jq没有内置此功能,请参见下文。
jq --argfile a a.json '
INDEX($a[]; .id) as $dict
| map( (.id|tostring) as $id
| if ($dict|has($id)) then .foo = $dict[$id].foo
else . end)' b.json
还有其他方法可以传递a.json和b.json的内容。
上面使用INDEX假定没有“冲突”,例如,如果一个对象的.id等于1,而另一个对象的.id等于“ 1”,则将发生这种情况。如果有可能发生这种冲突,则可以使用更复杂的INDEX定义。
INDEX/2
直接从builtin.jq:
def INDEX(stream; idx_expr):
reduce stream as $row ({}; .[$row|idx_expr|tostring] = $row);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句