77

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

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

1 つのオブジェクトに:

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

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

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

悲しいことに、このマニュアルは包括性に著しく欠けており、グーグルで調べても答えが見つかりません。

4

4 に答える 4

113

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

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

jq -s add

2 番目の問題については、配列を作成します。

jq -s .

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

効率的なソリューション

最初の問題 (縮小) については、丸呑み (-s オプションを使用するか、または を使用するか) よりも、および -n コマンドライン オプションを使用する[inputs]方が効率的です。たとえば、オブジェクトのストリームを 1 つのオブジェクトに結合するには、次のようにします。reduceinputs

jq -n 'reduce inputs as $in (null; . + $in)'

同様に、なし--null-input:

jq 'reduce inputs as $in (.; . + $in)
于 2015-12-27T04:56:04.123 に答える