awk とは、数値や文字列が規則正しく並んでいるテキストファイルに対して以下の操作を行うのに適したコマンド(スクリプト言語)である。
簡単な処理ならば、C言語でプログラムをするよりも、手早く行なうことができるので、
覚えておくといろいろ便利だろう。
また、文法はC言語に似ているので、C言語を知っている者には簡単に覚えることができる。
Linuxを始めUNIXには標準でインストールされているが、 DOS(WINDOWS)、Mac 用のものもある。
awk はコマンドラインでも、C言語のようにプログラムをファイルに書いても実行できるが、
まず、一番簡単なコマンドラインから、実行する方法をやってみる。
最初にも書いた通り、awk は何かのデータを元に処理を進めるので、例えばサンプルデータとして、以下のようなデータファイルを考える。
# cat data 1 2 3 4 5 6 7 8 9 #
このデータから、各行の最初のデータだけを取り出すには、以下のようにコマンドを打ち込む。
# awk '{print $1}' data 1 4 7 #
上のコマンドで、awk はコマンド名、その後の' (シングルクォート)で囲まれた部分が、
データファイル(data)に対して行なう、処理を表す部分である。
そして、awk では、C言語のように{から}までの部分に、プログラムを書いておく。
この場合、各行の1番目のデータを表示したいので、その1番目のデータを表す$1を、
C言語のprintfと同じような働きをするprintを使って、画面(標準出力)に表示している。
awk は、データファイルを先頭の行から、一行づつ読んで、処理を実行して行く。
上の例では、まず一行目の
1 2 3
を読んで、
{print $1}
を実行し(一番目の 1 を表示する)、以下同様に2行目、3行目と読んで、実行を繰り返してゆく。
各行を読み込むと、その行にあるデータを、
に、自動的に代入してゆく。
その1では、データの一部を取り出しただけだったが、 データを自由に並べ換えることもできる。
# cat data 1 2 3 4 5 6 7 8 9 # awk '{print $3,$2,$1}' data 3 2 1 6 5 4 9 8 7 #
今度は、$1 だけでなく $2 と $3 を , で区切って、
$3,$2,$1
の順番で並べている。
このように、 $1,$2,$3 などを使って、
データの順番を換えて、出力することができる。
出力するデータの順番や、個数は自由にできる。
# awk '{print $1,$1,$1}' data 1 1 1 4 4 4 7 7 7 # awk '{print $1,$2,$3,$1,$2,$3}' data 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9
awk では、計算式を使うこともできる。
例えば、各行のデータを合計したものを表示するには、以下のようにする。
# cat data 1 2 3 4 5 6 7 8 9 # awk '{print $1+$2+$3}' data 6 15 24 #
awk では、C言語とほぼ同じ計算式を使うことができる。
+ - * / % ( ) ++ -- += -= *= /=
などの演算子や、 sin() cos() sqrt() rand() などの算術関数が使用できる。
awk では、変数を使うこともできる。
awk の変数は
という特徴を持っている。
下の例で、データファイル中の数字全部を合計してみよう。
# cat data 1 2 3 4 5 6 7 8 9 # awk '{t += $1+$2+$3} \ <- バックスラッシュの後ろにEnter END{print t}' data 45 #
ここで、END というのは、全てのデータを読んだ後で、
最後に一度だけ、行なう処理を記述するために使用するものである。
(パターンというものだが、これについてはまた後ほど)
上の例での、awk の処理の進み方は、以下のようになる。
今までは、コマンドラインから awk を実行していたが、複雑で長いプログラムは、C言語のように、ファイルに書き込んでから実行することもできる。
その場合、awk に -f オプションをつけて、その後ろにプログラムのファイル名をつけて実行する。
各行3列づつの数値データを出力するプログラム。
(このようにawkはすでに存在するデータファイルを処理するだけでなく新しいデータを作ることもできる)
# cat mkdata.awk <- vi などで mkdata.awkを作っておく BEGIN { <- BEGINは最初に1回だけ実行される for(i = 1; i <= 3; i++){ print i, i+1, i+2; } } # awk -f mkdata.awk /dev/null <- ダミーのデータとして/dev/nullを使用 1 2 3 2 3 4 3 4 5