在同一键下合并数组

时间:2019-11-08 16:11:36

标签: json jq

我有两个包含对象的文件。每个对象的字段都是对象的数组。我想按每个键合并对象数组。

我尝试按jq -s '.[0] * .[1] | to_entries[].key ' file1.json file2.json获取所有键的列表。我不确定一旦捕获了对象数组,如何将键从。[1]更改为。[0]。

file1.json

{
    "foo": [
        {
            "nested": "object"
        }
    ],
    "bar": [
        {
            "nested": "object.bar"
        }
    ]

}

file2.json

{
    "foo": [
        {
            "nested": "object.foo2"
        }
    ],
    "baz": [
        {
            "nested": "object.baz"
        }
    ]

}

merged.json

{
    "foo": [
        {
            "nested": "object"
        },
        {
            "nested": "object.foo2"
        },

    ]
    "bar": [
        {
            "nested": "object.bar"
        }
    ]
    "baz": [
        {
            "nested": "object.baz"
        }
    ]

}

2 个答案:

答案 0 :(得分:2)

使用嵌套的reduce

reduce inputs as $in (.;
  reduce ($in | keys_unsorted[]) as $k (.;
    .[$k] += $in[$k]
  )
)

jqplay demo

答案 1 :(得分:2)

您可以使用以下内容:

df['Key']=df[['data','meta_data']].apply(tuple,1)
d={'word':' '.join,'start':'min','stop':'max','data':'first','meta_data':'first'}
df.groupby(df.Key.ne(df.Key.shift()).cumsum()).agg(d).reset_index(drop=True)
Out[171]: 
            word  start   stop  data  meta_data
0     but that's   2.72   3.09     2          9
1        alright   3.09   3.47     2          1
2  we'll have to   8.43   9.07     1          4
3           okay   9.19  10.01     2          2
4           sure  10.02  11.01     2          1
5          what?  11.02  12.00     1          4

Try it here

map(to_entries) | add | group_by(.key) | map({ key: (.[0].key), value:([.[].value | add]) }) | from_entries 将每个文件更改为键/值对数组。

map(to_entries)将这两个数组合并为一个。

add将数组的内容更改为多个数组,这些数组使用相同的键将对象重新组合。

group_by(.key)将这些数组转换为具有键/值对的对象,该键/值对的键是原始键,值是使用该键的不同对象的合并值。

map({ key: (.[0].key), value:([.[].value | add]) })从键/值对象数组重新创建对象。