UNIXコマンド awk % awk '条件文{実行文}' ファイル名 {} の前に任意の正規表現を書くと、そこにマッチした行に対して {} 内が実行される。 括弧は「中括弧」{}でなくてはならない。 条件文は省略可能。 -F オプション フィールドセパレータ 各列は$1 $2などは , で区切る。 % ls -l | awk '{print $5,$9}' ファイルサイズとファイル名の一覧が得られる。 % ls -l | awk '/abc/ {print $5,$9}' abc を含むそのファイルサイズとファイル名を表示する。 特殊なパターンとして BEGIN と END がある。BEGIN は最初に実行され、END は最後に実行される。 % ls -l | awk 'BEGIN { print "START!"} {total+=$5; print $9} END {print "size total="total} ' スクリプトとして動作させるには、 下記のようなスクリプトを作成して 例 #!/usr/bin/awk -f BEGIN { print "START!"} {total+=$5; print $9} END {print "size total="total} awk -f 作成したスクリプト を指定して実行 print文中ではC言語の主な演算記号が使える。 % awk '{print $1,$2*2.0,$3/3.0}' datafile 3列あるデータファイルのうち、1列目はそのまま、2列目は2倍、 3列目は3で割る % awk '$1 > 4.0{print}' datafile 一列目が4.0よりも大きければ出力。 print文で列を指定しなければ全列が出力される。$0と明示的に指定することも可能。 % awk '$1 <= 5.0 {print $3} $1 > 10.0 {print $2}' datafile 1列目が5以下なら3列目を出力し、1列目が10より大きければ2列目を出力。 % awk '$1 == "S"{print}' datafile 条件文の中で比較対象が文字の場合は、""で括る。 % awk '$1 !~ "#"{print}' datafile 読み飛ばしたい行には行頭に#をつけ、#をコメントアウト行と認識させる。 #で始まる行はスキップする。正確には、1列目に#が含まれていなければ出力する。 ~はその列にある文字が含まれている時という条件を表し、 !は直後の条件を否定(not)する。 % awk '{printf("%d %f %s\n",$1,$2,$3)}' datafile 出力書式を指定したいときに用いる。 printfの用法はC言語のprintfに準ずる。 % awk 'NF >0 {print $1}' datafile 空行をスキップさせる。 NFはawkの変数で、現在読み込んでいる行の列(フィールド)の数を表す。 % awk '{if ($1 == "B" || $1 == "N") print "B"; else print "C"}' datafile if/else文。複雑な条件文を組み込む。 if文以下の||は「または」(or)を表す。「かつ」(and)は&&。 % awk '{if ($1 !~ "#") if ($1 == 0 && $2 == 0) print $0,0.5,"r"; else print $0,$1/($1+$2); else print "# is escaped."}' datafile 同じくif/else文。二重に入れ子になっているとき。 上記の例は二行に分けてあるが、実際は一行につなげて書く。 % awk 'NR==1{s0=$1 } NR!=1{r=$1-s0; s0=$1; print r}' datafile 前後の行での処理。例は、1列目において、1行前の値を今の行の値から引いて出力する。 1行目では今の値を保持させるのみとし、2行目以降で引き算を行っている。 NRはNFと同様にawkの変数で、処理をした行の数を表す。 s0というのは、自分で設定した変数。ここに前の行の一列目の値を保持させている。 % awk '{print substr($0,3,6);}' datafile 3文字目から6文字出力 awk内の変数を挙げる。 NF :列の数 NR :行の数。 FILENAME :今読み込んでいるファイルの名前