Удаление нескольких ключей одновременно с помощью 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())
?
Ответы
Ответ 1
Вы можете указать поток путей для удаления:
$ cat test.json | jq 'map(del(.Country, .number, .Language))'
Кроме того, учтите, что вместо черного списка определенных ключей вы можете предпочесть белый список тех, которые вы хотите:
$ cat test.json | jq 'map({label, region, locale, currency})'
Ответ 2
delpaths
, и, возможно, немного менее загадочно:
map( delpaths( [["Country"], ["number"], ["Language"]] ))
Ответ 3
Помимо ответа @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