RIGHT:寄稿:東條遼平 サンプルプログラムの入力テキストには以下のものを使っています。(progreport) programing report 123.4 Linux vine 4567 knoppix filter java c 567 awk hogehoge foofoo * int(x) [#hd2054aa] xの整数部分を取り出す。 $ awk 'BEGIN{print int(-3.9), int(4.5)}' -3 4 * sqrt(x) [#mb8384e8] xの平方根の絶対値の取得。 $ awk 'BEGIN{print sqrt(3.9), sqrt(4.5)}' 1.97484 2.12132 * exp(x) [#ieb43137] eのx乗を取得。 $ awk 'BEGIN{print exp(3.9), exp(1)}' 49.4024 2.71828 * log(x) [#ga976506] xの自然対数を取得。 $ awk 'BEGIN{print log(2.71828459), log(1)}' 1 0 * sin(x) [#u838ceda] 正弦を取得。xはラジアン。 $ awk 'BEGIN{print sin(1.570796), sin(3.1415926535897)}' 1 9.33812e-14 * cos(x) [#k5587d8a] 余弦を取得。xはラジアン。 $ awk 'BEGIN{print cos(1.570796), cos(3.1415926535897)}' 3.26795e-07 -1 * atan2(y,x) [#ddd5ded2] y/x逆正接をラジアンで取得。 $ awk 'BEGIN{print atan2(1,1), atan2(1.732, 1)}' 0.785398 1.04718 * rand() [#x9c873b2] 0<x<1となるランダムな値xを取得。ただし、起動する度同じ並びの値となる。 $ awk 'BEGIN{print rand(), rand(), rand()}' 0.237788 0.291066 0.845814 $ awk 'BEGIN{print rand(), rand(), rand()}' 0.237788 0.291066 0.845814 * srand(x) [#v2bbf78a] rand()のシードを設定。引数省略で時間がシードとなる。戻り値は前回のシード。 $ awk 'BEGIN{srand(); print rand(), rand(), rand()}' 0.816933 0.122664 0.18146 $ awk 'BEGIN{srand(); print rand(), rand(), rand()}' 0.421141 0.354221 0.73009 $ awk 'BEGIN{srand(1); print rand(), rand(), rand()}' 0.237788 0.291066 0.845814 $ awk 'BEGIN{srand(1); print rand(), rand(), rand()}' 0.237788 0.291066 0.845814 $ awk 'BEGIN{srand(1); print rand(), rand(), rand(), srand()}' 0.237788 0.291066 0.845814 1 * index(str,find) [#ib64a0e7] 文字列strから文字列findを探し、最初にヒットした位置を返す。ヒットしなければゼロ。 $ awk 'BEGIN{print index("progreport", "ogre")}' 3 $ awk 'BEGIN{print index("progreport", "program")}' 0 * length(str) [#l82c750d] 文字列strの文字数を返す。引数省略で$0が渡される。 $ awk 'BEGIN{print length("progreport")}' 10 $ awk 'BEGIN{print length(23.5)}' 4 $ awk '{print length(); print}' < progreport 23 programing report 123.4 31 Linux vine 4567 knoppix filter 14 java c 567 awk 15 hogehoge foofoo * match(str, r) [#w7936701] 文字列strの中で正規表現rで表現される最も長く、最も左に位置する部分文字列の先頭 位置を予約変数RSTARTに、文字数をRLENGTHに格納。一致するものが無ければ RSTARTはゼロ、RLENGTHは-1となる。 $ awk 'BEGIN{match("hhohoghogo", "hog"); print RSTART, RLENGTH}' 4 3 $ awk 'BEGIN{match("hhohoghogo", "hoge"); print RSTART, RLENGTH}' 0 -1 $ awk 'BEGIN{match("hhohoghogo", /hog*/); print RSTART, RLENGTH}' 2 2 $ awk 'BEGIN{match("hhohoghogo", /hog.*/); print RSTART, RLENGTH}' 4 7 * split(str, array, s) [#z8536790] 文字列strを区切り文字列sで区切り、区切られた部分文字列をarray[1]から順に格納。 区切られた部分文字列の数を返す。sを省略することで予約変数FSが区切り文字列として使われる。 $ awk 'BEGIN{b=split("prog@report@awk",a,"@");for(i=0;i<b;i++)print a[i+1]}' prog report awk $ awk 'BEGIN{b=split("prog@report@awk",a,"report"); for(i=0;i<b;i++) print a[i+1]}' prog@ @awk $ awk 'BEGIN{b = split("prog report awk", a); for(i=0; i<b; i++) print a[i+1]}' prog report awk $ awk 'BEGIN{FS="@"; b = split("prog report awk", a); for(i=0; i<b; i++) print a[i+1]}' prog report awk * sprintf(fmt, ...) [#oa007c83] 表示せずに結果を文字列として返すprintf。 $ awk 'BEGIN{sprintf("%d %s", 100, "progreport")}' $ awk 'BEGIN{print sprintf("%d %s", 100, "progreport")}' 100 progreport * sub(r,replace,str) [#j5072a0c] strの文字列から正規表現rで表される最初の部分文字列をreplaceで置き換える。 結果はstrに格納されるためstrは参照で無ければならない。また第三引数を省略すると$0が与えられる。 $ awk 'BEGIN{str="programing report"; sub(/programing/, "Awk", str); print str}' Awk report $ awk 'BEGIN{str="programing report"; sub(/programing/, "Awk &", str); print str}' Awk programing report $ awk 'BEGIN{str="programing programing report"; sub(/programing/, "Awk \\&", str); print str}' Awk & programing report $ awk '{sub(/programing/, "Awk"); print}' progreport Awk report 123.4 Linux vine 4567 knoppix filter java c 567 awk hogehoge foofoo * gsub(r,replace,str) [#nc58d85c] subと違い正規表現rで表される部分文字列全てをreplaceで置き換える。 $ awk 'BEGIN{str="programing programing report"; gsub(/programing/, "Awk \\&", str); print str}' Awk & Awk & report * substr(str,start,length) [#ydc3e052] strの文字列のstart番目の文字からlength文字の部分文字列を返す。 第三引数の省略でstart番目以降全てを結果として返す。 $ awk 'BEGIN{print substr("programingreport", 4, 5)}' grami $ awk 'BEGIN{print substr("programingreport", 11)}' report * tolower(str) [#q6d273f5] 文字列strのアルファベットで大文字の物を全て小文字にする。 $ awk 'BEGIN{print tolower("ProgramingReport.")}' programingreport. * toupper(str) [#m8936977] 文字列strのアルファベットで小文字の物を全て大文字にする。 $ awk 'BEGIN{print toupper("ProgramingReport.")}' PROGRAMINGREPORT. * systime() [#xaa91a00] 基準地での1970年1月1日0時からの秒数を返す。 $ awk 'BEGIN{print systime()}' 1137087981 * strftime(fmt,timestamp) [#acced575] timestampはsystime()で与えられる値の形式で、fmtのフォーマットに合わせて整形された データを返す。timestampの省略で現在時が使われ、fmtを省略するとデフォルトのフォーマット に変換される。またフォーマットに関してはANSI Cのstrftimeと同じものが使えるようであるので、 $man strftime や、 $jman strftime で見ることができる。 $ awk 'BEGIN{print strftime()}' 金 1月 13 02:46:33 JST 2006 $ awk 'BEGIN{print strftime("%a %F %p%l", 1009141340)}' 月 2001-12-24 午前 6