【发布时间】:2020-09-14 06:58:28
【问题描述】:
我有 2 个 JSON 文件,我想根据另一个更新其中一个。 更具体地说,如果一个特定的键:值对在文件之间匹配,我想更新另一个(并且只有一个)键:值对。
a.json 如下所示:
[
{"i":"1234","f":"123","a":"0"},
{"i":"1235","f":"123","a":"0"},
{"i":"1236","f":"123","a":"0"},
{"i":"1237","f":"123","a":"0"},
{"i":"1238","f":"123","a":"0"}
]
b.json 如下:
[
{"i":"1234","f":"555","a":"1"},
{"i":"1235","f":"555","a":"1"},
{"i":"1236","f":"555","a":"1"},
{"i":"1237","f":"555","a":"1"},
{"i":"1238","f":"555","a":"1"}
]
我想更新 b.json,以便如果 b.json 的“i”值与 a.json 的“i”值匹配,则“f”的值将替换为 a.json 的值。 IE。我希望 b.json 看起来像这样:
[
{"i":"1234","f":"123","a":"1"},
{"i":"1235","f":"123","a":"1"},
{"i":"1236","f":"123","a":"1"},
{"i":"1237","f":"123","a":"1"},
{"i":"1238","f":"123","a":"1"}
]
所以要明确一点,只有 f 值必须被替换,而不是 a 的值。
我找到了这个部分解决方案:
1) 创建一个名为 update.jq 的文件,这样:
reduce keys[] as $k (.; if $a|has($k) then .[$k] = $a[$k] else . end)
2) 运行:
jq --argfile a a.json -f a.jq b.json
这为我提供了 f 和 a 都已更新的情况但我只想更新 f。如何确保只有 f 得到更新?
[
{"i":"1234","f":"555","a":"0"},
{"i":"1235","f":"555","a":"0"},
{"i":"1236","f":"555","a":"0"},
{"i":"1237","f":"555","a":"0"},
{"i":"1238","f":"555","a":"0"}
]
【问题讨论】:
-
只是为了确认您只是想使用 jq 获得结果?
-
看看 -> stackoverflow.com/questions/60228327/… 。问题陈述与您的相似
-
@khari-sing 是的,我是。