昨天我們認識了 jq slurp,把多個 json 輸入讀取成為一個大的陣列,便於整合不同 json 之間的資料。而我們使用 .movingDirection 移動方向的欄位,做對應,如 "N" 對應為 "北 ↑"。今天來試試,如果是風速顯示為對應的蒲福風級,該如何做呢?
師傅:今天我們來學習如何使用 jq 處理蒲福風級表的資料。
徒弟:好的,師傅。蒲福風級表是什麼?
師傅:蒲福風級表是用來描述風力強度的標準。每個級數都有最小和最大風速。
徒弟:明白了。那麼我們要如何處理這些資料呢?
師傅:首先,我們需要將字串型態的風速轉換為數字。看這個例子:
echo '{"maxWindSpeed": "10.7"}' | jq '.maxWindSpeed | tonumber'
徒弟:這會將 "10.7" 轉換為數字 10.7 對吧?
師傅:沒錯。接下來,我們需要判斷風速是否在某個級數的範圍內。
echo '{"speed": 10.5, "min": 8.0, "max": 10.7}' | jq '.speed >= .min and .speed < .max'
徒弟:這會輸出 true 嗎?因為 10.5 在 8.0 和 10.7 之間。
師傅:正確。接著結合這兩個概念,運用於先前山陀兒颱風的資料之中吧。
將氣象局提供的的蒲福風級表轉換成 beaufort_wind.json,如下:
[
{ "level": "0 無風", "min": 0, "max": 0.3 },
{ "level": "1 軟風", "min": 0.3, "max": 1.6 },
{ "level": "2 輕風", "min": 1.6, "max": 3.4 },
{ "level": "3 微風", "min": 3.4, "max": 5.5 },
{ "level": "4 和風", "min": 5.5, "max": 8.0 },
{ "level": "5 清風", "min": 8.0, "max": 10.8 },
{ "level": "6 強風", "min": 10.8, "max": 13.9 },
{ "level": "7 疾風", "min": 13.9, "max": 17.2 },
{ "level": "8 大風", "min": 17.2, "max": 20.8 },
{ "level": "9 烈風 ", "min": 20.8, "max": 24.5 },
{ "level": "10 狂風 ", "min": 24.5, "max": 28.5 },
{ "level": "11 暴風 ", "min": 28.5, "max": 32.7 },
{ "level": "12 颶風 ", "min": 32.7, "max": 37 },
{ "level": "13 颶風+", "min": 37, "max": 41.5 },
{ "level": "14 颶風++", "min": 41.5, "max": 46.2 },
{ "level": "15 颶風+++", "min": 46.2, "max": 51.0 },
{ "level": "16 颶風++++", "min": 51.0, "max": 56.1 },
{ "level": "17 颶風+++++", "min": 56.1, "max": 61.3 },
{ "level": "爆表了(°Д°)", "min": 61.4, "max": 90 }
]
tonumber
並做比較字串轉數字在 jq 中,可以使用 tonumber
函數。用法就是 欄位 | tonumber
接著,我們用蒲福風級的陣列資料每一筆,比較欄位的值是否位於最小值與最大值之間。注意,這邊必須要是數值才能做大小的比較;使用文字做比較會有錯誤的結果。假設上面的陣列資料已經讀取為 $wind
變數,程式碼如下:
((.maxWindSpeed|tonumber) as $speed | $wind[] | select($speed>=.min and $speed<.max) | .level)
上面這個指令首先將輸入的風速轉為數字存為$speed
變數,然後一筆一筆的比較蒲福風級表的每個級數,選擇風速落在其範圍內的級數,最後輸出對應的風力等級。
原本的程式修改之後,把資料的時間點往前挪,可以看到 10/1 最大陣風有爆表的風速,登陸的 10/3 中午風速已經略降了,只是在沒有山脈的阻擋情況下,直接往都市平原吹的風力還是非常恐怖的。
時間 經度 緯度 氣壓 風速MAX 陣風MAX 方向 預測
2024-10-01T06 119.8 20.7 915 16 颶風++++ 爆表了(°Д°) 北 ↑
...(略)
2024-10-03T12 120.3 22.5 965 12 颶風 14 颶風++ 東北 ↗
2024-10-03T13 120.3 22.6 965 12 颶風 14 颶風++ 北 ↑
2024-10-03T14 120.4 22.6 965 12 颶風 14 颶風++ 東 →
今天認識了字串轉數字的 tonumber
的用法、用到了數字大小的比較 $speed>=.min and $speed<.max
,仔細看這個練習,是不是應用了我們之前學的很多用法呢? 今天的修改可以參考 程式碼 。
感謝自己,今天也認真學習和練習😄。感謝大家互相幫忙,持續整理收拾山陀兒颱風留下的滿地傷。