web-dev-qa-db-ja.com

jqで一度に複数のキーを削除する

JSONから複数のキーを一度に削除する必要があります(jqを使用)。これを行うには、毎回mapとdelを呼び出すよりも良い方法があるかどうかを調べています。これが私の入力データです:

test.json

_[
  {
    "label": "US : USA : English",
    "Country": "USA",
    "region": "US",
    "Language": "English",
    "locale": "en",
    "currency": "USD",
    "number": "USD"
  },
  {
    "label": "AU : Australia : English",
    "Country": "Australia",
    "region": "AU",
    "Language": "English",
    "locale": "en",
    "currency": "AUD",
    "number": "AUD"
  },
  {
    "label": "CA : Canada : English",
    "Country": "Canada",
    "region": "CA",
    "Language": "English",
    "locale": "en",
    "currency": "CAD",
    "number": "CAD"
  }
]
_

各項目について、番号、言語、国のキーを削除します。私はこのコマンドでそれを行うことができます:

_$ cat test.json | jq 'map(del(.Country)) | map(del(.number)) | map(del(.Language))'
_

それはうまくいき、私は望ましい出力を得ます:

_[
  {
    "label": "US : USA : English",
    "region": "US",
    "locale": "en",
    "currency": "USD"
  },
  {
    "label": "AU : Australia : English",
    "region": "AU",
    "locale": "en",
    "currency": "AUD"
  },
  {
    "label": "CA : Canada : English",
    "region": "CA",
    "locale": "en",
    "currency": "CAD"
  }
]
_

ただし、削除する複数のラベルを指定するjqの方法があるかどうかを理解しようとしているため、複数のmap(del())ディレクティブを使用する必要はありませんか?

13
antun

削除するパスのstreamを指定できます。

$ cat test.json | jq 'map(del(.Country, .number, .Language))'

また、特定のキーをブラックリストに登録するのではなく、必要なものをホワイトリストに登録することをお勧めします。

$ cat test.json | jq 'map({label, region, locale, currency})'
18
user3899165

delpathsも知っておく価値があり、おそらく少し不思議ではありません。

map( delpaths( [["Country"], ["number"], ["Language"]] ))
2
peak

@ user3899165の回答に加えて、「サブオブジェクト」からキーのリストを削除することがわかりました

_example.json

{
    "a": {
        "b": "hello",
        "c": "world",
        "d": "here's",
        "e": "the"
    },
    "f": {
        "g": "song",
        "h": "that",
        "i": "I'm",
        "j": "singing"
    }
}
_

$ jq 'del(.a["d", "e"])' example.json

1
russholio