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())
ディレクティブを使用する必要はありませんか?
削除するパスのstreamを指定できます。
$ cat test.json | jq 'map(del(.Country, .number, .Language))'
また、特定のキーをブラックリストに登録するのではなく、必要なものをホワイトリストに登録することをお勧めします。
$ cat test.json | jq 'map({label, region, locale, currency})'
delpaths
も知っておく価値があり、おそらく少し不思議ではありません。
map( delpaths( [["Country"], ["number"], ["Language"]] ))
@ 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