【问题标题】:jq: grab specific repeating key-value from first N elementsjq:从前 N 个元素中获取特定的重复键值
【发布时间】:2020-12-16 19:42:50
【问题描述】:

我正在尝试解析 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 对(例如:shortForecasttemperature 等),但我无法弄清楚如何组合它全部归为一个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 的语法错误。
  • 我正在运行:jq-1.5-1-a5b5cbe
  • 哦,我知道我的语法错误在哪里:.properties.periods.[:3] 中句点和 [:3] 之间的额外句点

标签: json jq key-value weather-api


【解决方案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

【讨论】:

  • 太好了,感谢您的解释。这给了我一些选择!
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2022-10-14
  • 2012-02-16
  • 2012-06-21
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多