繁体   English   中英

使用 jq 检查 JSON 文件数组中的值

[英]Check values in JSON file array using jq

我是初学者,我正在尝试制作一个 bash 脚本,该脚本从网站下载数据并告诉我服务的每小时价格,并告诉我什么时候便宜,什么时候贵。

curl -s https://something.json | jq '.tomorrow[] | select(.region=="region3") | {values, median}'

从那个命令我得到这个:

{
  "values": [
    71.65,
    70.76,
    70.63,
    71.43,
    73.47,
    84.35,
    88.18,
    97.98,
    112.65,
    155.36,
    155.32,
    207.12,
    252.48,
    311.12,
    350.38,
    452.02,
    461.86,
    503.09,
    487.77,
    465.18,
    401.17,
    335.88,
    298.53,
    255.61
  ],
  "median": 243.08
}

我想检查每个值与中位数的比较并打印出类似

At 1am it is cheap
...
At 5pm it is expensive
...
At 11pm it is cheap
...

我试过了,但没用

curl -s https://something.json | jq '.tomorrow[] | select(.region=="region3") | {values, median} | if .values >= .median then "Expensive" elif .values <= .median then "Cheap"'

我也考虑过使用 walk() 但不太明白。

您可以使用to_entries ,它将使用数组的索引作为键:

.median as $median
| .values
| to_entries[]
| "At \(.key+1) it is \(if .value >= $median then "expensive" else "cheap" end)"

您还可以在插入字符串之前修改键和值:

.median as $median
| .values
| to_entries[]
| .key += 1
| .value |= if . >= $median then "expensive" else "cheap" end
| "At \(.key) it is \(.value)"

我怀疑您的数据是否从 01:00 开始并在 00:00 (24:00) 结束,但如果确实如此,那么您将如何格式化它:

.median as $median
| .values
| to_entries[]
| .ampm = if (.key+1)%24 >= 12 then "pm" else "am" end
| .key %= 12
| .key += 1
| .value |= if . >= $median then "expensive" else "cheap" end
| "At \(.key)\(.ampm) it is \(.value)"

但我假设 at 从 00:00 开始到 23:00 结束,这会使代码简单得多。

使用jq -r ( --raw-output ) 运行时为 Output:

At 1am it is cheap
At 2am it is cheap
At 3am it is cheap
At 4am it is cheap
At 5am it is cheap
At 6am it is cheap
At 7am it is cheap
At 8am it is cheap
At 9am it is cheap
At 10am it is cheap
At 11am it is cheap
At 12pm it is cheap
At 1pm it is expensive
At 2pm it is expensive
At 3pm it is expensive
At 4pm it is expensive
At 5pm it is expensive
At 6pm it is expensive
At 7pm it is expensive
At 8pm it is expensive
At 9pm it is expensive
At 10pm it is expensive
At 11pm it is expensive
At 12am it is expensive

这是一种方式(假设第一个条目对应于凌晨 12 点):

(.values | to_entries)[] as {$key, $value}
| "At \($key * 3600 | strftime("%l %P")) it is \(
    if $value < .median then "cheap" else "expensive" end
  )"
At 12 am it is cheap
At  1 am it is cheap
At  2 am it is cheap
At  3 am it is cheap
At  4 am it is cheap
At  5 am it is cheap
At  6 am it is cheap
At  7 am it is cheap
At  8 am it is cheap
At  9 am it is cheap
At 10 am it is cheap
At 11 am it is cheap
At 12 pm it is expensive
At  1 pm it is expensive
At  2 pm it is expensive
At  3 pm it is expensive
At  4 pm it is expensive
At  5 pm it is expensive
At  6 pm it is expensive
At  7 pm it is expensive
At  8 pm it is expensive
At  9 pm it is expensive
At 10 pm it is expensive
At 11 pm it is expensive

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM