jqを使用してJSONオブジェクトを同じキーと結合する方法

jqを使用してJSONオブジェクトを同じキーと結合する方法

次のコードスニペットをJSONにエクスポートします。

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
    }
  }
}
{
  "daisy": {
    "dev": {
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

私はこれらのオブジェクトを次のように結合したいと思います:

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

どうすればいいですかjq

ベストアンサー1

2 つのオブジェクトを乗算するとマージされます。以下は、reduce既存のオブジェクトを 1 つずつマージして、常に新しいオブジェクトを作成するために使用されます。

これを行う2つの同様の方法があります。

  1. 使用-ninputs:reduce

    jq -n 'reduce inputs as $item ({}; . *= $item)' file
    

    inputs渡されたオブジェクトを1つずつ返す関数を使用します。 ()と-n一緒に使用すると、--null-input一般的な入力読み取りを無効にできます。

  2. 使用-s.[]:reduce

    jq -s 'reduce .[] as $item ({}; . *= $item)' file
    

    これは、生データ-s--slurp)を配列として読み込み、reduce配列を繰り返すために使用されます。入力が大きいと、メモリが非常に非効率的で速度が遅くなる可能性があります。

データの結果(createat行からカンマを削除して修正):

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

複数のオブジェクトが同じキーを共有し、そのキースカラーまたは大量にこの場合、入力の後続のオブジェクトはこの値を上書きします。

おすすめ記事