Разбор Json вложенных объектов в Bash - PullRequest
0 голосов
/ 27 марта 2020

Я получаю доступ к API, который возвращает JSON с вложенными объектами, как это:

{
  "9273": {
    "status": "ok",
    "tag": "group-8",
    "name": "London"
  },
  "4029": {
    "status": "unknown",
    "tag": "group-12",
    "name": "Tokyo"
  },
  "6322": {
    "status": "ok",
    "tag": "group-12",
    "name": "Singapore"
  },
  "1038": {
    "status": "unknown",
    "tag": "group-19",
    "name": "Melbourne"
  },
  "2938": {
    "status": "ok",
    "tag": "group-12",
    "name": "New York"
  }
}

Я пытаюсь проанализировать JSON, используя jq, regex, sed et c. в сценарии Bash отфильтруйте его по status (ok) и tag (самая высокая группа с «ok») и сгладьте соответствующие объекты, чтобы получить многострочное отсортированное строковое значение их name вдоль с префиксом stati c (например, City).

Желаемый вывод ниже:

City: New York
City: Singapore

Буду признателен за любую помощь в решении этого вопроса.

1 Ответ

3 голосов
/ 27 марта 2020

Используя ваши данные и используя параметр командной строки -r, следующая программа выдаст вывод, показанный ниже:

[.[]]
| map(select(.status == "ok"))
| (max_by( .tag | sub("group-";"") | tonumber) | .tag) as $mx
| .[]
| select(.tag==$mx)
| "City: \(.name)"

Вывод:

City: Singapore
City: New York

Если вы хотите города перечислены в алфавитном порядке, затем вы можете добавить соответствующий фильтр sort_by в конвейер jq.

...