web-dev-qa-db-ja.com

jqで配列要素を削除する方法は?

Jqを使用してJSONから配列要素を削除する方法を理解しようとしています。以下は、入力と必要な出力です。

jq .Array[0] 

必要な配列要素を出力します。

{
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }

しかし、これを次のように再ラップするにはどうすればよいですか?

{
  "blah0": "zeroblah",
  "Array": [

そして

  ]
}

入力:

{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    },
    {
      "blah2": [
        "key2:val2"
      ],
      "foobar2": "barfoo2",
      "foobar3": "barfoo3"
    }
  ]
}

必要な出力:

{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }
  ]
}
8
Paul Ericson

Paul Ericson の質問の2番目の部分について

しかし、もっと一般的には、jqがどのように選択的な配列要素の制御を可能にするかを理解しようとしています。次回は、配列要素1、3、5、11を削除したいと思います。

要素1、3、5、11を削除するには、

del(
    .Array[1,3,5,11]
)

ただし、一般的には、delの引数としてより高度なフィルターを使用できます。たとえば、このフィルタは、.Arrayキーが.foobar2である"barfoo2"内の要素を削除します。

del(
    .Array[]
  | select(.foobar2 == "barfoo2")
)

この例で生成する

{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }
  ]
}
12
jq170727

最も単純なものは次のとおりです。

del(.Array[1])
4
peak