如何将jq中的对象序列组合成一个对象?

时间:2015-12-27 04:24:49

标签: arrays json addition jq fileslurp

我想转换对象流:

{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}

成一个对象:

{
  "a": "red",
  "b": "white",
  "c": "purple"
}

另外,如何将相同的序列包装到数组中?

[
    {
      "a": "green",
      "b": "white"
    },
    {
      "a": "red",
      "c": "purple"
    }
]

可悲的是,手册严重缺乏全面性,谷歌搜索也没有找到答案。

4 个答案:

答案 0 :(得分:50)

如果你的输入是一个对象流,那么除非你的jq有inputs,否则这些对象必须是" slurped"使用-s命令行选项,以便将它们组合在一起。

因此,在输入流中组合对象的一种方法是使用:

jq -s add

对于第二个问题,创建一个数组:

jq -s .

当然还有其他选择,但这些都很简单,不需要最新版本的jq。使用jq 1.5及更高版本,您可以使用'输入' jq -n '[inputs]'

答案 1 :(得分:4)

使用-s命令行选项进行slurping的替代方法是使用inputs过滤器。像这样:

jq -n '[inputs] | add'

这将生成一个包含所有输入对象的对象。

答案 2 :(得分:2)

要将对象组合成数组,可以使用以下命令:

$ echo '
{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}' | jq -n '[inputs]'
[
  {
    "a": "green",
    "b": "white"
  },
  {
    "a": "red",
    "c": "purple"
  }
]

答案 3 :(得分:2)

如果您通过 jq 过滤器而不是外部输入达到这一点,mwag's comment 建议将您的 jq 过滤器包装在 [] 中可能会有用。

示例:

$ echo '[{"foo":42},{"foo":43}]' | jq '.[]'
{
  "foo": 42
}
{
  "foo": 43
}
$ echo '[{"foo":42},{"foo":43}]' | jq '[.[]]'
[
  {
    "foo": 42
  },
  {
    "foo": 43
  }
]

另见jq Github issue #684: Creating an array from objects?