如何用jq对比JSON数组值与中位数并输出时段价格高低
Bash脚本实现:region3价格判断
下面是针对你需求的完整实现,包含数据提取、价格判断的核心逻辑,同时解释你困惑的walk()用法:
完整脚本
#!/bin/bash # 1. 下载目标JSON数据(替换为实际的API地址) price_json=$(curl -s "https://your-target-url.com/prices.json") # 2. 用jq提取region3的价格数组和中位数 # 注意:如果你的JSON结构不同,需要调整jq的路径,比如把.regions[]改成对应层级 region3_prices=$(echo "$price_json" | jq -r '.regions[] | select(.name == "region3") | .price_data.values[]') region3_median=$(echo "$price_json" | jq -r '.regions[] | select(.name == "region3") | .price_data.median') # 3. 遍历每个价格,和中位数比较判断 echo "=== region3时段价格判断 ===" while read -r price; do # bash不支持浮点运算,用bc工具做比较 if (( $(echo "$price < $region3_median" | bc -l) )); then echo "时段价格:$price → 便宜(低于中位数 $region3_median)" else echo "时段价格:$price → 昂贵(高于/等于中位数 $region3_median)" fi done <<< "$region3_prices"
关键细节解释
数据提取的jq逻辑
select(.name == "region3"):精准筛选出region3的节点.price_data.values[]:把价格数组展开为每行一个数值,方便bash遍历- 如果你的JSON结构是
{"region3": {"price_data": {...}}}这种直接顶级键的形式,把jq命令改成.region3.price_data.values[]即可
浮点比较的问题
bash原生只支持整数运算,所以必须用bc工具处理浮点比较:
echo "$price < $region3_median" | bc -l:返回1表示条件成立,0表示不成立(( ... ))将返回值转为bash可识别的布尔判断
walk()的正确用法(你不需要用它)
walk()是jq的递归遍历函数,用于批量修改整个JSON结构的所有节点,比如要把所有数值字段乘2:
walk(if type == "number" then . * 2 else . end)
你的需求只需要提取特定数组和单个值做比较,完全用不到walk(),之前尝试无效是因为场景不对。
可选优化
- 可以加入curl失败的判断:如果
curl -s返回空,直接报错退出 - 如果需要更精细的判断阈值,比如低于中位数90%才算便宜,修改bc表达式为
$price < $region3_median * 0.9
内容的提问来源于stack exchange,提问作者eintriognitti
相关产品推荐
相关产品推荐

