Подтвердить что ты не робот

Удаление нескольких ключей одновременно с помощью 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())?

4b9b3361

Ответ 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