如何合并2 json文件使用jq? [英] How to merge 2 json file using jq?
问题描述
我在shell脚本中使用 jq 工具(jq-json-processor)来解析json。
我有2个json文件,要将它们合并成一个唯一文件。
文件内容:
file1
{
value1:200,
timestamp:1382461861,
value:{
aaa:{
value1: v1,
value2:v2
},
bbb:{
value1:v1 v2
},
ccc:{
value1:v1,
value2:v2
}
}
file2
{
status:200,
timestamp:1382461861,
value:{
aaa:{
value3:v3,
value4:4
},
bbb:{
value3: v3
},
ddd:{
value3:v3,
value4:4
}
} $ b}
预期结果
{
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 $ b},
bbb:{
value3:v3
},
aaa:{
value4:4,
value3:v3
}
}
这个命令:
jq -s'。[]。value'file1 file2
解决方案从1.4开始可以使用
*
运算符。当给定两个对象时,它将递归地合并它们。例如,jq -s'。[0] *。[1]'file1 file2
会得到你:
{
value1:200,
timestamp:1382461861,
value:{
aaa:{
value1:v1,
value2:v2,
value3:v3,
value4:4
},
bbb:{
value1:v1,
value2:v2,
value3:v3 b $ b},
ccc:{
value1:v1,
value2:v2
},
ddd :{
value3:v3,
value4:4
}
},
status:200
}
如果你还想摆脱其他键(像你的预期结果),一种方法是这样的:
jq -s'。[0] *。[1] | {value:.value}'file1 file2
合并任何其他值):
jq -s'。[0] .value *。 {value:。}'file1 file2
I'm using the jq tools (jq-json-processor) in shell script to parse json.
I've got 2 json files and want to merge them into one unique file
Here the content of files:
file1
{ "value1": 200, "timestamp": 1382461861, "value": { "aaa": { "value1": "v1", "value2": "v2" }, "bbb": { "value1": "v1", "value2": "v2" }, "ccc": { "value1": "v1", "value2": "v2" } } }
file2
{ "status": 200, "timestamp": 1382461861, "value": { "aaa": { "value3": "v3", "value4": 4 }, "bbb": { "value3": "v3" }, "ddd": { "value3": "v3", "value4": 4 } } }
expected result
{ "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 } } }
I try a lot of combinaison but the only result i get is the following, which is not the expected result:
{ "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" } }
Using this command:
jq -s '.[].value' file1 file2
解决方案Since 1.4 this is now possible with the
*
operator. When given two objects, it will merge them recursively. For example,jq -s '.[0] * .[1]' file1 file2
Would get you:
{ "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 }
If you also want to get rid of the other keys (like your expected result), one way to do it is this:
jq -s '.[0] * .[1] | {value: .value}' file1 file2
Or the presumably somewhat more efficient (because it doesn't merge any other values):
jq -s '.[0].value * .[1].value | {value: .}' file1 file2
这篇关于如何合并2 json文件使用jq?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!