フィールドとレコード

awk の処理は:

BEGIN{アクション}
パターン 1 {アクション}
パターン 2 {アクション}
...
END{アクション}

で構成される.

今回は awk のテキスト処理の中心部である, パターン{アクション} の部分について, もう少し解説する. ここをよく理解することが awk を使いこなす上で決定的に重要になる.

レコードとフィールド

awk の本処理, パターン{アクション}は:

1. 入力テキストを 1 レコード (一行) ずつ読み込む
2. レコードをフィールドに区切る
3. レコードがパターンに合致していれば処理を行う
4. 入力テキストが終わるまで, 1 から 3 を繰り返す

1, 2 は awk がやってくれる. プログラマの仕事を 3 の部分を記述することである.

レコードとフィールド分割の利用

例えば, 次のようなテキスト (awk_data2.txt) があるとする

awk_data2.txt

I am Fei
You are Emiko
He is Taro
She is Megumi
We are friends

一行目の内容をフィールドとレコードに分割すると, 下のようになる:

I: 第 1 フィールド
am: 第 2 フィールド
Fei: 第 3 フィールド
I am Fei: レコード

特殊変数について:

$0: レコート
$1: 第 1 フィールド
$2: 第 2 フィールド
$3: 第 3 フィールド
...
$n: 第 n フィールド

下記は awk_data2.txt に対していくつかの例を上げたいと思う

まずは, ファイルの中にあるすべてのレコード を出力する:

[cactus:~/code_awk/tuts]% gawk '{print $0}' awk_data2.txt
I am Fei
You are Emiko
He is Taro
She is Megumi
We are friends

第 1 フィールドと 第 2 フィールドの内容を出力する:

[cactus:~/code_awk/tuts]% gawk '{print $1 $3}' awk_data2.txt
IFei
YouEmiko
HeTaro
SheMegumi
Wefriends

もうちょっと工夫して出力する:

[cactus:~/code_awk/tuts]% gawk '{print $1 " " $3}' awk_data2.txt
I Fei
You Emiko
He Taro
She Megumi
We friends

最後は疑問文を作ろう:

[cactus:~/code_awk/tuts]% gawk '{print $2 " " $1 " " $3 "?"}' awk_data2.txt
am I Fei?
are You Emiko?
is He Taro?
is She Megumi?
are We friends?

最後のフィールドを出力するために, 特殊変数 $3 を使ってよいが, 実際には $NF も使えるはず. それを利用して実行結果は:

[cactus:~/code_awk/tuts]% gawk '{print $NF}' awk_data2.txt
Fei
Emiko
Taro
Megumi
friends

列の数 (NF) を出力すると:

[cactus:~/code_awk/tuts]% gawk '{print NF}' awk_data2.txt
3
3
3
3
3

行の数 (NR) を出力すると:

[cactus:~/code_awk/tuts]% gawk '{print NR}' awk_data2.txt
1
2
3
4
5

今読み込んでいるファイルの名前を出力すると:

[cactus:~/code_awk/tuts]% gawk '{print FILENAME}' awk_data2.txt
awk_data2.txt
awk_data2.txt
awk_data2.txt
awk_data2.txt
awk_data2.txt