awk の使い方

awk とは

awk とは、数値や文字列が規則正しく並んでいるテキストファイルに対して以下の操作を行うのに適したコマンド(スクリプト言語)である。

簡単な処理ならば、C言語でプログラムをするよりも、手早く行なうことができるので、 覚えておくといろいろ便利だろう。
また、文法はC言語に似ているので、C言語を知っている者には簡単に覚えることができる。
Linuxを始めUNIXには標準でインストールされているが、 DOS(WINDOWS)、Mac 用のものもある。

awk の簡単な使い方 その1

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 における処理の進み方

awk は、データファイルを先頭の行から、一行づつ読んで、処理を実行して行く。
上の例では、まず一行目の

1 2 3

を読んで、

{print $1}

を実行し(一番目の 1 を表示する)、以下同様に2行目、3行目と読んで、実行を繰り返してゆく。
各行を読み込むと、その行にあるデータを、

に、自動的に代入してゆく。

awk の簡単な使い方 その2

その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 における計算

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 では、変数を使うこともできる。
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 の処理の進み方は、以下のようになる。

  1. 1行目を読む
    1. $1+$2+$3 を計算する( 1 + 2 + 3 = 6 )
    2. その合計を、変数 t に加算する
      ( t は最初 0 に初期化されるので、中身は 6 になる )
  2. 2行目を読む
    1. $1+$2+$3 を計算する( 4 + 5 + 6 = 15 )
    2. その合計を、変数 t に加算する ( 6 + 15 = 21 )
  3. 3行目を読む
    1. $1+$2+$3 を計算する( 7 + 8 + 9 = 24 )
    2. その合計を、変数 t に加算する ( 21 + 24 = 45 )
  4. ENDの部分を実行する
    print t によって、t の中身 45 が出力される。
  5. 終り

プログラムをファイルに書いて実行する方法

今までは、コマンドラインから awk を実行していたが、複雑で長いプログラムは、C言語のように、ファイルに書き込んでから実行することもできる。
その場合、awk に -f オプションをつけて、その後ろにプログラムのファイル名をつけて実行する。

ファイルによる実行方法

  1. vi などで、プログラムを書き込む。
  2. awk -f (プログラムファイル名) (データファイル名) で実行。
  3. エラーが出たらもう一度 vi などで修正して、2 に戻る。

各行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

参考


Prev | Next
Home | Contents
abe@injapan.net