用jq 1.4合并两个文件中的对象数组

时间:2019-02-28 12:23:33

标签: arrays json join merge jq

我有两个文件,这些文件具有以下JSON,需要使用每个对象的相对数组位置进行合并:

文件1

{
  "input": [
    {
      "email": "test1@gm.com",
      "firstName": "Fred"
    },
    {
      "email": "someone@gm.com",
      "firstName": "James"
    }
  ]
}

文件2:

{
  "result": [
    {
      "id": 50,
      "status": "created"
    },
    {
      "id": 51,
      "status": "rejected"
    }
  ]
}

预期结果是input [1]的元素与result [1]的元素相结合,依此类推,如下所示:

{
  "combined": [
    {
      "email": "test1@gm.com",
      "firstName": "Fred",
      "id": 50,
      "status": "created"
    },
    {
      "email": "someone@gm.com",
      "firstName": "James",
      "id": 51,
      "status": "rejected"
    }
  ]
}

PS:-我在Solaris上只能使用1.4版,因此没有[inputs]功能

2 个答案:

答案 0 :(得分:3)

您可以使用--slurp选项将两个文件读入一个数组,然后从那里循环遍历一个数组的键并将两个数组的相应元素加在一起相对简单。

jq --slurp '
{
  combined: [
    .[0].input as $is|
    .[1].result as $rs|
    range(0; $is|length) as $n|
    $is[$n]+$rs[$n]
  ]
}
' file1.json file2.json

答案 1 :(得分:1)

如果您可以使用jq的最新版本,则可以利用transpose函数来轻松组合它们:

$ jq -n '{ combined: ([inputs[]] | transpose | map(add)) }' input1.json input2.json

但是,由于限制为1.4,因此您的选择受到限制。处理多个文件时,将所有输入读入内存很有用。 --slurp允许您读取数组中的所有输入。但是,您将不得不以不同的方式将输入压缩在一起。

$ jq --slurp 'add | reduce range(0; .input | length) as $i (.;
    .combined += [.input[$i] + .result[$i]]
) | {combined}' input1.json input2.json