iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
AI/ ML & Data

使用 jq 處理資料系列 第 20

Day20: jq 的變數

  • 分享至 

  • xImage
  •  

當我們回顧昨日學習的 jq 語法中 if-then-else-end 結構時,發現可能有更優雅的表達方式。今天,我們將進一步探討 jq 中變數的應用,改善寫法。

對話中學習

師傅:今天我們學習 jq 中變數的使用。

徒弟:好的,師傅。我們之前用過 if-then-else 來處理方向,用變數會更好嗎?該怎麼做呢?

師傅:首先,我們可以將"方向對應關係"定義為變數。

徒弟:哦,是像字典那樣嗎?

師傅:沒錯。看這個:

jq -n '{"N": "北 ↑", "S": "南 ↓", "E": "東 →", "W": "西 ←",  "NE": "東北 ↗", "SE": "東南 ↘", "SW": "西南 ↙", "NW": "西北 ↖"} as $direction | $direction'

徒弟:我明白了。那麼,我們怎麼使用這個變數$direction呢?

師傅:使用方括號取值。這樣:$direction[.movingDirection]

徒弟:哦!所以如果 .movingDirection 是 "N",就會顯示 "北 ↑"?

師傅:正確。試試完整的寫法。

徒弟:讓我試試...是這樣嗎?

jq  '{"N": "北 ↑", "S": "南 ↓", "E": "東 →", "W": "西 ←",  "NE": "東北 ↗", "SE": "東南 ↘", "SW": "西南 ↙", "NW": "西北 ↖"} as $direction | $direction[.movingDirection]'

師傅:很好。這比之前的 if-then-else 結構更簡潔。

徒弟:真的!這樣使用變數感覺更靈活了。

師傅:記住,變數可以讓你的程式碼更易讀、更易維護。


jq 變數 ... as $變數名稱 | ...

在 jq 中,變數的使用有以下幾個要點:

  • 變數名稱必須以 $ 開頭
  • 變數可以使用字母、數字和底線,但不能以數字開頭
  • 變數常用於儲存中間結果、簡化複雜表達式,或在多個地方重複使用相同的值

拿滯留多日、卻轉眼消逝的山陀兒颱風為例,使用變數之後修改程式碼為:

jq -c -r "{\"N\": \"北 ↑\", \"S\": \"南 ↓\", \"E\": \"東 →\", \"W\": \"西 ←\",  \"NE\": \"東北 ↗\", \"SE\": \"東南 ↘\", \"SW\": \"西南 ↙\", \"NW\": \"西北 ↖\"} as $direction|[\"時間     \",\"經度\",\"緯度\",\"氣壓\",\"風速MAX\",\"陣風MAX\",\"方向 \",\"預測\"],[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName==\"KRATHON\") | .analysisData.fix[-5:][] | [.fixTime[0:13], (.coordinate|split(\",\")[0]), (.coordinate|split(\",\")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, $direction[.movingDirection], .movingPrediction[0].value]][] | @tsv" typhoon0930.json

於是,留下滿地瘡痍的山陀兒颱風,在文字消息最後的身影:

https://ithelp.ithome.com.tw/upload/images/20241004/200783897qp4ENRvbe.png

結論

今天我們認識了 jq 宣告變數、以及使用變數來取值的用法。最常見的使用情境就是如風向對應這種字典的使用方式,可以參考 原始碼

平安就是福,感謝自己今天也認真地學習了😊。


上一篇
Day19: jq 的 if-then-else-end
下一篇
Day21: jq slurp
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言