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

#json #jq #key-value #weather-api

#json #jq #ключ-значение #погода-api

Вопрос:

Я пытаюсь проанализировать https://api.weather.gov/gridpoints/PHI/47 ,91 / прогноз/ ежечасно, с умеренным успехом.

 {
  "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"
 

Комментарии:

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

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

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

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

Комментарии:

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