そーいえば awk ってあったよね。
awk っていえば perl を知る前にずいぶんお世話になった気がする。
Famous Awk One-Liners Explained, Part I - good coders code, great reuse には代表的な awk の one-liner(一行プログラミング) が紹介されていたっす。
懐かしさのあまり数年ぶりに Linux で awk を走らせてみたよ。
やっぱ、便利だな。
なお、awkの基本事項については
AWK Cheat Sheet を参考にしてね。
awk はコマンドラインから使ったりすることが多いね。
たとえばこんな感じ。
awk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' ~/.tcshrc
あと、awk独特の予約変数が幾つかあるね。
■awkの予約変数
FS : 入力時のフィールドセパレータ(デフォルトはスペース)
OFS : 出力時のフィールドセパレータ(デフォルトはスペース)
NF : 入力レコードの現在のフィールド番号
NR : 現在の入力レコード番号
RS : レコードセパレータ(デフォルトは改行)
で、上記のサイトの例から幾つかピックアップして実際にやってみた。
サンプルファイル1:test.txt
My name is Taro .
This book is mine .
He is angry .
Her name is Reiko .
She is younger than I .
サンプルファイル2:num.txt
1 2 3
4 10 9 1
8 2
0 2 4
9 1
例1:行番号を表示する(その1)
awk '{ printf("%5d : %s\n", NR, $0) }' test.txt
結果
1 : My name is Taro .
2 : This book is mine .
3 :
4 : He is angry .
5 : Her name is Reiko .
6 : She is younger than I .
例2:行番号を表示する(その2)
awk 'NF { $0=++a " :" $0 }; { print }' test.txt
結果
1 :My name is Taro .
2 :This book is mine .
3 :He is angry .
4 :Her name is Reiko .
5 :She is younger than I .
例3:行数を数える( wc -l )
gawk 'END { print NR }' test.txt
結果
6
例4:各行の和をそれぞれ求める
gawk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }' num.txt
結果
6
24
10
6
10
例5:すべての和を求める
gawk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }' num.txt
結果
56
例6:文字(word)がいくつあるかを求める
gawk '{ total = total + NF }; END { print total }' test.txt
結果
25
うーむ、なかなか便利だねぇ。
これから(たまに)使ってみようかな。