Jq: получить конкретный повторяющийся ключ-значение из первых N элементов

Я пытаюсь разобрать https://api.weather.gov/gridpoints/PHI/47,91/forecast/hourly, с небольшим успехом.

{
  "number": 1,
  "name": "",
  "startTime": "2020-12-16T13:00:00-05:00",
  "endTime": "2020-12-16T14:00:00-05:00",
  "isDaytime": true,
  "temperature": 30,
  "temperatureUnit": "F",
  "temperatureTrend": null,
  "windSpeed": "15 mph",
  "windDirection": "NE",
  "icon": "https://api.weather.gov/icons/land/day/snow,40?size=small",
  "shortForecast": "Chance Light Snow",
  "detailedForecast": ""
}

Я начал с jq '.properties.periods[0]', чтобы получить первый элемент, работал с jq '.properties.periods[0].shortForecast' и понял, что jq '.properties.periods[0,1,2,3]' дает мне первые 4 элемента в массиве.

Однако при попытке я сталкиваюсь с синтаксической ошибкой jq '.properties.periods[:3]'

jq: ошибка: синтаксическая ошибка, неожиданное '['

который, как я думал, будет сокращением от 0-3.

Кроме того, мне нужны только (одинаковые, повторяющиеся) определенные пары K/V от каждого элемента (например: shortForecast, temperature и т. д.), но я не смог понять, как объединить все это в одно выражение jq.

Итак, как мне получить определенные значения из первых X элементов массива? (Мне действительно не нужны ключи, только значения.)

Бонус: было бы здорово, если бы все значения каждого элемента отображались в одной строке.

Образец:

"2020-12-16T14:00:00-05:00" 30 "Chance Light Snow"
"2020-12-16T15:00:00-05:00" 30 "Snow"
"2020-12-16T16:00:00-05:00" 29 "Heavy Snow"

Не удается воспроизвести синтаксическую ошибку с JQ 1.6.

oguz ismail 16.12.2020 20:48

Я бегу: jq-1.5-1-a5b5cbe

Ogal Finklestein 16.12.2020 21:46

О, я вижу, где моя синтаксическая ошибка: дополнительная точка между точками и [:3] в .properties.periods.[:3]

Ogal Finklestein 17.12.2020 14:35
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
3
289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

.properties.periods[:3] оценивается как массив из трех элементов, тогда как .properties.periods[0,1,2] создает детализацию. Таким образом, аббревиатура последнего будет:

.properties.periods[:3][]

Выбор

Существует множество возможностей, например. чтобы получить определенный набор пар ключ-значение в одной строке:

jq -c '.properties.periods[:3][]
       | {shortForecast, temperature}' input.json

Чтобы выбрать только значения в формате CSV:

.properties.periods[:3][]
| {shortForecast, temperature}
| [.[]]
| @csv

Вместо этого вы можете использовать @tsv, или join(" "), или ....

Бонус

Чтобы получить все значения в том порядке, в котором они даны, вы можете просто опустить строку выбора: | {....}

Однако это было бы не так надежно. Следующее будет безопаснее:

.properties.periods[:3]
| (.[0] | keys_unsorted) as $keys
| .[]
| [.[$keys[]]]
| @tsv

Отлично, спасибо за объяснение. Это дает мне несколько вариантов, с которыми можно повозиться!

Ogal Finklestein 17.12.2020 14:42

Другие вопросы по теме