我正在使用shell脚本中的处理器工具(jq- json - jq )来解析json。
我有两个文件,想把它们合并成一个唯一的文件json
这里是文件的内容:
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
}
}
}
预期结果
{
"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
发布于 2014-07-23 15:27:14
从1.4开始,可以使用*
运算符执行此操作。当给定两个对象时,它将递归地合并它们。例如,
jq -s '.[0] * .[1]' file1 file2
重要提示:请注意 -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
发布于 2014-06-19 14:29:45
使用jq -s add
$ echo '{"a":"foo","b":"bar"} {"c":"baz","a":0}' | jq -s add
{
"a": 0,
"b": "bar",
"c": "baz"
}
这会将标准输入中的所有JSON文本读取到一个数组中(jq -s
会这样做),然后“减少”它们。
(add
被定义为def add: reduce .[] as $x (null; . + $x);
,它遍历输入数组的/对象的值并将它们相加。Object addition == merge。)
发布于 2014-03-02 06:21:47
谁知道你是否仍然需要它,但这里是解决方案。
一旦使用了--slurp
选项,就很容易了!
--slurp/-s:
Instead of running the filter for each JSON object in the input,
read the entire input stream into a large array and run the filter just once.
然后,+
操作符将执行您想要的操作:
jq -s '.[0] + .[1]' config.json config-user.json
(注意:如果你想合并内部对象,而不是仅仅用右文件对象覆盖左文件对象,则需要手动完成)
https://stackoverflow.com/questions/19529688
复制相似问题