6 AWK の関数
AWK では、自分で関数を定義することもできますが、
デフォルトで使える関数も色々あります。
テキスト処理フィルタという性格から
文字列処理関数が主に用意されていますが、
数学関数なども用意されています。
数学関数には以下のようなものがあります。
- sin(x) =
x
のサインの値 (x
はラジアン)
- cos(x) =
x
のコサインの値 (x
はラジアン)
- atan2(y,x) =
tan = y/x
となる
の値
(
- <
)
- exp(x) = ex
- log(x)
= logex
(自然対数の値)
- sqrt(x)
=
- int(x) =
x
の整数部分
- rand() =
0 以上 1 未満の一様な乱数値 (呼び出す度に値が違う)
- srand(x) =
rand() の初期値を決めるパラメータ (種) を設定
int(x) は、C での floor(x) (x
以下の最大の整数) や
ceil(x) (x
以上の最小の整数) とは違い、
int(1.5)=1, int(-1.5
)=-1
のようになります。
rand() は小数の値をランダムに返しますが、srand() を使わなければ、
AWK の実行の度に同じ列を繰り返し生成することになりますので、
srand(x) を使って初期値を変動させます。
しかし、AWK の実行の度に x
(整数) が同じならば、
やはり同じ乱数列が生成されてしまいますので、
C ではプログラム実行時の時刻を使ってそれが常に変化するようにします。
AWK でも、x
を省略して単に srand() とすると、
現在の時刻 (正確には 1970 年 1 月 1 日 00:00:00 からの秒数)
を種にセットします。
文字列処理関数には以下のようなものがあります。
- index(s,c) =
文字列 s
の中に含まれる文字列 c
の先頭位置
(s
の中に c
が含まれていなければ 0 を返す)
- length(s) =
文字列 s
の長さ (C での strlen())
- substr(s,n,len) =
文字列 s
の n
番目の文字から
len
文字分の文字列 (len
を省略した場合は最後まで)
- sub(r,s,c) =
文字列 c
の正規表現 r
に
最初にマッチした部分を文字列 s
で置きかえる
(c
を省略した場合、現在の入力行が c
になる)
- gsub(r,s,c) =
文字列 c
の正規表現 r
に
マッチした部分を全部文字列 s
で置きかえる
(c
を省略した場合、現在の入力行が c
になる)
- match(s,r) =
文字列 s
で正規表現 r
にマッチした
部分文字列の先頭位置を返す
(予約済み変数 RSTART に先頭位置を、RLENGTH に部分文字列の長さをセットする)
- printf(f,...) =
C 言語の printf(f,...) とほぼ同じ
(() は通常省略できる)
- print(s) =
printf("%s\n",s)
とほぼ同じ
(() は通常省略できる)
- sprintf(f,...) =
printf(f,...) で
出力されるべき文字列を返す (C 言語の sprintf() に似たもの)
- split(s,a,r) =
文字列 s
を正規表現 r
を区切りとして分割し、
配列 a に、a[1],a[2],...と順に収める
(r
を省略した場合はホワイトスペース区切りとし、分割個数を返す)
- tolower(s) =
文字列 s
に含まれるアルファベットの大文字は
小文字に変換したものを返す
- toupper(s) =
文字列 s
に含まれるアルファベットの小文字は
大文字に変換したものを返す
AWK では文字列の連結も容易に行なえ、並べて書けば連結、',' を入れて書けば
空白一つを入れて連結、となります。よって、
a = "1" "234","5 6","7" " 89";
とすると a は "1234 5 6 7 89" となります。
その他に、以下のような関数もあります。
- delete a[j] =
配列の要素 a[j] を削除
- systime() =
1970 年 1 月 1 日 00:00:00 からの秒数
- strftime(f,n) =
1970 年 1 月 1 日 00:00:00 からの秒数 n
を、書式 f
に従って書き直した文字列を返す
- system(s) =
文字列 s
をコマンドラインとして OS 上で実行し、
その終了コードを返す
竹野茂治@新潟工科大学
2007年12月23日