如何合并2 json文件使用jq? [英] How to merge 2 json file using jq?

查看:301
本文介绍了如何合并2 json文件使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆