我想更改另一个 json 文件指定的 json 文件中的字段。我的输入文件是这样的:
{"id": 10, "name": "foo", "some_other_field": "value 1"}
{"id": 20, "name": "bar", "some_other_field": "value 2"}
{"id": 25, "name": "baz", "some_other_field": "value 10"}
Run Code Online (Sandbox Code Playgroud)
我有一个外部覆盖文件,指定如何name覆盖某些对象,例如:
{"id": 20, "name": "Bar"}
{"id": 10, "name": "foo edited"}
Run Code Online (Sandbox Code Playgroud)
如上所示,覆盖可能比输入短,在这种情况下name应该保持不变。这两个文件都可以轻松放入可用内存中。
鉴于上述输入和覆盖,我想获得以下输出:
{"id": 10, "name": "foo edited", "some_other_field": "value 1"}
{"id": 20, "name": "Bar", "some_other_field": "value 2"}
{"id": 25, "name": "baz", "some_other_field": "value 10"}
Run Code Online (Sandbox Code Playgroud)
作为 的初学者jq,我不太确定从哪里开始。虽然有一些问题涵盖了类似的领域(最接近的是这个),但我无法弄清楚如何将解决方案应用于我的案例。
有很多可能性,但最简单、有效的解决方案可能是使用内置函数:INDEX/2,例如如下:
jq -n --slurpfile dict f2.json '
(INDEX($dict[]; .id) | map_values(.name)) as $d
| inputs
| .name = ($d[.id|tostring] // .name)
' f1.json
Run Code Online (Sandbox Code Playgroud)
这inputs与 -n 选项一起使用来读取第一个文件,以便可以依次处理每个 JSON 对象。
由于该解决方案很短,因此借助在线jq 手册应该很容易解决。
这个解决方案有一个警告:由于使用“tostring”(例如,如果{"id": 10}和{"id": "10"}两者都发生),字典中的 id 之间不会出现“冲突”。
如果字典确实或可能存在此类冲突,那么可以对上述解决方案进行相应调整,但这有点棘手。
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |