web-dev-qa-db-ja.com

jqのオブジェクトのシーケンスを1つのオブジェクトに結合する方法は?

オブジェクトのストリームを変換したい:

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

1つのオブジェクトに:

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

また、同じシーケンスを配列にラップするにはどうすればよいですか?

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

残念なことに、このマニュアルには包括性が非常に欠けており、グーグルでも答えが見つかりません。

39
Jennifer M.

入力がオブジェクトのストリームである場合、jqにinputsがない限り、オブジェクトは「丸 "み」されている必要があります。 -sコマンドラインオプションを使用して、それらを結合します。

したがって、入力ストリーム内のオブジェクトを結合する1つの方法は、次を使用することです。

jq -s add

2番目の問題では、配列を作成します。

jq -s .

もちろん他の選択肢もありますが、これらは単純であり、jqの最新バージョンを必要としません。 jq 1.5以降では、「入力」を使用できます。 jq -n '[inputs]'

53
peak

-sコマンドラインオプションを使用した丸lurみの代わりに、inputsフィルターを使用します。そのようです:

jq -n '[inputs] | add'

これにより、すべての入力オブジェクトが結合されたオブジェクトが生成されます。

9
Evgeny