我在外壳程序脚本中使用jq工具(jq-json-processor)来解析json。
我有2个json文件, 想将它们合并为一个唯一的文件
这里是文件的内容:
文件1
{ "value1": 200, "timestamp": 1382461861, "value": { "aaa": { "value1": "v1", "value2": "v2" }, "bbb": { "value1": "v1", "value2": "v2" }, "ccc": { "value1": "v1", "value2": "v2" } } }
文件2
{ "status": 200, "timestamp": 1382461861, "value": { "aaa": { "value3": "v3", "value4": 4 }, "bbb": { "value3": "v3" }, "ddd": { "value3": "v3", "value4": 4 } } }
预期结果
{ "value": { "aaa": { "value1": "v1", "value2": "v2", "value3": "v3", "value4": 4 }, "bbb": { "value1": "v1", "value2": "v2", "value3": "v3" }, "ccc": { "value1": "v1", "value2": "v2" }, "ddd": { "value3": "v3", "value4": 4 } } }
我尝试了很多组合,但是我得到的唯一结果是以下结果,这不是预期的结果:
{ "ccc": { "value2": "v2", "value1": "v1" }, "bbb": { "value2": "v2", "value1": "v1" }, "aaa": { "value2": "v2", "value1": "v1" } } { "ddd": { "value4": 4, "value3": "v3" }, "bbb": { "value3": "v3" }, "aaa": { "value4": 4, "value3": "v3" } }
使用此命令:
jq -s '.[].value' file1 file2
从1.4开始,*操作员现在可以做到这一点。当给定两个对象时,它将递归合并它们。例如,
*
jq -s '.[0] * .[1]' file1 file2
重要:请注意该-s (--slurp)标志,它将文件放置在同一阵列中。
-s (--slurp)
会给你:
{ "value1": 200, "timestamp": 1382461861, "value": { "aaa": { "value1": "v1", "value2": "v2", "value3": "v3", "value4": 4 }, "bbb": { "value1": "v1", "value2": "v2", "value3": "v3" }, "ccc": { "value1": "v1", "value2": "v2" }, "ddd": { "value3": "v3", "value4": 4 } }, "status": 200 }
如果您还想摆脱其他键(如您的预期结果),一种方法是:
jq -s '.[0] * .[1] | {value: .value}' file1 file2
或者大概更有效(因为它没有合并任何其他值):
jq -s '.[0].value * .[1].value | {value: .}' file1 file2