json配列の内容をフィルタリングしますが、親エントリをjqに保持する方法は?

json配列の内容をフィルタリングしますが、親エントリをjqに保持する方法は?

次のJSONがあります。

{
  "Vpcs": [
    {
      "VpcId": "vpc-1",
      "OwnerId": "abc"
    },
    {
      "VpcId": "vpc-2",
      "OwnerId": "def"
    }
  ]
}

要素だけがOwnerId!=abc欲しいが、Vpcsの親配列はそのまま維持したいと思います。

これにより、echo $JSON|jq -r '.Vpcs[]|select(.OwnerId!="abc")次のような結果が得られます。

{
  "VpcId": "vpc-2",
  "OwnerId": "def"
}

これは私が望むものと似ていますが、親配列はありません。だから私は次のようにselectステートメントに親配列を入れなければならないと思いました。

echo $JSON |jq -r '.|select(.Vpcs[].OwnerId!="abc")'

しかし、これは私が望むデータをフィルタリングしないようです。

{
  "Vpcs": [
    {
      "VpcId": "vpc-1",
      "OwnerId": "abc"
    },
    {
      "VpcId": "vpc-2",
      "OwnerId": "def"
    }
  ]
}

次のような結果を得るにはどうすればよいですか?

{
  "Vpcs": [
    {
      "VpcId": "vpc-2",
      "OwnerId": "def"
    }
  ]
}

ベストアンサー1

構造を「再構築」することがオプションの場合は、次のことができます。

jq '.Vpcs[]|select(.OwnerId!="abc")|{Vpcs: [.]}'

おすすめ記事