AWK 是一門非常精簡的程式語言,只有少數幾種基本資料型態。 在這個單元裡,我們會一起看看數字和字串。
AWK 的數字是以雙精度浮點數實作的。 整數、浮點數和雙精度浮點數之間沒有區別。
AWK 看得懂八進位數字常數(以0開頭)與十六進位數字常數(以0x或0X開頭)。
你可以使用標準的算術運算子 +、-、*、/、%。
指數運算子是 ^。
AWK 也有一些內建的數值函式,包括三角函式、隨機數字產生,以及用來把數字截斷成 x 與零之間最接近整數的 int(x)。
AWK 的字串是由字元組成的序列。 使用雙引號來指定字串常數。
字串運算只有一種:串接。 串接沒有專屬的運算子; 只要把兩個字串並排放在一起,就會將它們串接起來:
BEGIN {
hw = "Hello" "World"
print hw
}
# => HelloWorld
print 是敘述,不是函式。
print 不需要括號。
AWK 有許多字串操作函式。 隨著我們在這門課程中繼續學習,會深入介紹它們。
沒有明確的運算子可以在數字與字串之間轉換。 AWK 會依照程式的上下文隱含地自動轉換。 這讓處理輸入欄位的值變得非常簡單:AWK 通常就是會照你想要的去做。
print x + y會因為+這個數值運算,把x和y變數的值轉換成數字。print x y會因為串接運算,把x和y變數的值轉換成字串。如果你想明確表達轉換,0 + x會給出 x 的數字表示,而"" x會給出 x 的字串表示。
AWK 把字串轉換成數字的方式可能會讓人困惑。 一個簡單的理解方式是:AWK 會從字串開頭讀取「數字字元」,直到遇到「非數字」字元為止。 一些例子:
"2.5"會轉換成數字2.5;"1e3"會轉換成數字1000(科學記號);"456abc"會轉換成數字456(因為a不是「數字」,轉換就到此停止)。"abc789"會轉換成數字0(字串的開頭沒有數字)。你正在幫一位朋友,把他從花園各個角落收集到的讀數整理成一份報告。 可惜的是,你朋友把資料存成了一種奇怪的格式。 每一筆讀數都是一組以逗號分隔的欄位。 不過,他把兩位數拆成兩個欄位來儲存。
| 欄位編號 | 意義 |
|---|---|
| 1 | 識別碼 |
| 2 | 位置 |
| 3 | 第一筆讀數的十位數 |
| 4 | 第一筆讀數的個位數 |
| 5 | 第二筆讀數的十位數 |
| 6 | 第二筆讀數的個位數 |
以101,house,4,2,5,4這樣的輸入列為例:
42,54。你的任務是算出兩筆讀數的平均值,並以下列格式輸出每一列的結果:
#<id>, <label> = <average>
由於 42 和 54 的平均值是 48,範例列的輸出應該會是:
#101, house = 48