AWK 的內建函數 Built-in Functions
(一). 字串函數
- index( 原字串, 找尋的子字串 ):
若原字串中含有欲找尋的子字串,則傳回該子字串在原字串中第一次
出現的位置,若未曾出現該子字串則傳回0.
例如執行 :
$awk 'BEGIN{ print index("8-12-94","-" }'
結果印出 2
- length( 字串 ) : 傳回該字串的長度.
例如執行 :
awk 'BEGIN { print length("John") '}
結果印出 4
- match( 原字串, 用以找尋比對的 Regular Expression :
AWK會在原字串中找尋合乎Regular Expression的子字串. 若合乎
條件的子字串有多個, 則以原字串中最左方的子字串為準.
AWK找到該字串後會依此字串為依據進行下列動作:
- 設定AWK內建變數 RSTART, RLENGTH :
RSTART &= 合條件之子字串在原字串中之位置.
&= 0 ; 若未找到合條件的子字串.
RLENGTH &= 合條件之子字串長度.
&= -1 ; 若未找到合條件的子字串.
- 傳回 RSTART 之值.
例如執行 :
awk ' BEGIN {
match( "banana", /(an)+/ )
print RSTART, RLENGTH
}
'
執行結果印出 2 4
- split( 原字串, 陣列名稱, 分隔字元(field separator):
AWK將依所指定的分隔字元(field separator)來分隔原字串成
一個個的欄位(field),並以指定的陣列記錄各個被分隔的欄位.
例如 :
ArgLst = "5P12p89"
split( ArgLst, Arr, /[Pp]/)
執行後 Arr[1]=5, Arr[2]=12, Arr[3]=89
- sprintf( 列印之格式, 列印之資料, 列印之資料,...)
該函數之用法與AWK或C的輸出函數printf()相同. 所不同的是
sprintf()會將要求印出的結果當成一個字串傳回
一般最常使用sprintf()來改變資料格式. 如: x 為一數值資料, 若欲
將其變成一個含二位小數的資料,可執行如下指令 :
x = 28
x = sprintf("%.2f",x)}
執行後 x = "28.00"
- sub( 比對用的 Regular Expression}, 將替換的新字串, 原字串 )
sub( )將原字串中第一個(最左邊)合乎所指定的Regular Expression
的子字串改以新字串取代.
- 第二個參數"將替換的新字串"中可用"&"來代表"合於條件的
子字串"
承上例,執行下列指令:
A = "a6b12anan212.45an6a"
sub( /(an)+[0-9]*/, "[&]", A)
結果印出ab12[anan212].45an6a
- sub()不僅可執行取代(replacement)的功用,當第二個參數為
空字串("")時,sub()所執行的是``去除指定字串''的功用.
- 藉由 sub()與 match()的搭配使用,可逐次取出原字串中合乎
指定條件的所有子字串.
例如執行下列程式:
awk '
BEGIN {
data = "p12-P34 P56-p61"
while( match( data ,/[0-9]+/) >0) {
print substr(data,{ RSTART, RLENGTH })
sub(/[0-9]+/,"")
}
}
' $* }
結果印出 :
12
34
56
61
- sub( )中第三個參數(原字串)若未指定,則其預設值為$0.
可用 sub( /[9-0]+/,"digital" ) 表示 sub(/[0-9]+/,"digital",$0 )
- gsub( 比對用的 Regular Expression}, 將替換的新字串, 原字串)
這個函數與 sub()一樣,同樣是進行字串取代的函數. 唯一不同點是
- gsub()會取代所有合條件的子字串.
- gsub()會傳回被取代的子字串個數.
請參考 sub().
- substr( 字串,起始位置 [,長度] ):
傳回從起始位置起,指定長度之子字串. 若未指定長度,則傳回起始
位置到自串末尾之子字串.
執行下例
awk {' BEGIN{ print substr( "User:Wei-Lin Liu", 6)}
結果印出
Wei-Lin Liu
(二). 數學函數
- int(x) : 傳回x的整數部分(去掉小數).
例如 :
int(7.8) 將傳回 7
int(-7.8) 將傳回 -7
- sqrt(x) : 傳回x的平方根.
例如 :
sqart(9) 將傳回 3
若 x 為負數,則執行 sqrt(x)時將造成 Run Time Error
- exp(x) : 將傳回e的x次方.
例如 :
exp(1) 將傳回 2.71828
- log(x) : 將傳回x以e為底的對數值.
例如 :
log(e) = 1
若 x< 0 ,則執行 sqrt(x)時將造成 Run Time Error.
- sin(x) : x 須以徑度量為單位,sin(x)將傳回x的sin函數值.
- cos(x) : x 須以徑度量為單位,cos(x)將傳回x的cos函數值
- atan2(y,x) : 傳回 y/x 的tan反函數之值,傳回值係以徑度量為單位.
- rand( ) : 傳回介於 0與1之間的(近似)亂數值; 0 < rand()<1.
除非使用者自行指定rand()函數起始的seed,否則每次執行AWK
程式時, rand()函數都將使用同一個內定的seed,來產生亂數.
- srand(x) : 指定以x為rand( )函數起始的seed.
若省略了x,則AWK會以執行時的日期與時間為rand()函數起始的seed.