はじめに
最近、某大手のジョブスケジュラーの出力CSVを整理するという雑務で、久々にshellScriptとawkでテキスト処理をおこなったので、今更ながら思いながらawkを便利さを語りたい。
awkとは
awkとは、UnixやLinuxでデフォルトで入っていて、ファイル処理用のパターンマッチングに適したユーティリティプログラム。Shellもかけて、sedと組み合わせたら超便利。
行毎のテキストファイルを処理するの適していて、列の入れ替えや加工も余裕です。
GNUの拡張版でパターンマッチングに正規表現が使えるgawkもあります。
UNIX,LINUXで仕事してきたおじさんたちは、まぁ、使えるはず。しらんけど。
awkの実行構文
awkは、1例であるが下記のような実行方法に実行を行う。
-- Scriptを直書き
awk [option] 'Script' input-files
-- Script-fileを指定(拡張子は、awk)
awk [option] -f script-file input-files
あとは、cat等の標準入力を使ったパターンもあるが割愛します。
入力データ
レコードとフィールドに分割され、レコードは行、フィールドは空白文字で区切られます。レコードとフィールドの区切り文字は RS と FS で指定して変更できます。
下記のような空白文字区切りのtxtがあります.
前述がわかるように一例を記載します。
[qiita]
cat hoge.txt
あ い う え お
か きくけこ
たち つ て と
## $0 で行全体
[qiita]
awk '{print $0}' hoge.txt
あ い う え お
か きくけこ
たち つ て と
## $1 $3 でテキストの1列目と3列目を抽出し表示
[qiita]
awk '{print $1 $3}' hoge.txt
あう
か
たちて
Scriptの記載方法
awkのScriptは、パターン(pattern)と処理手順(Procedure)に別れます。
pattern { procedure }
パターンは、省略ができ、省力すると全ての行が処理手順が適用されます
-- 正規表現が指定できます。
[例]
1.正規表現で[あ]から始まる行の1列目、2列目を表示
[qiita]
awk '/^あ/ { print $1 $2 }' hoge.txt
あい
- 条件に合致した行を対象とする($1が[あ]の行だけ)
[qiita]
awk '$1 == "あ" {print $0 }' hoge.txt
あ い う え お
- BEGIN, END は,、一番最初と一番最後に処理を実行します。
[qiita]
awk '
> BEGIN { print "BEGIN" }
> {print $0 }
> END{ print "END"}
> ' hoge.txt
BEGIN
あ い う え お
か きくけこ
たち つ て と
END
まとめ
ちょっと長くなってきので終わりにします
まだまだ組み込み変数や演算子やら関数がありますが、awkに興味を持たれたら、
便利だと思うので一度使ってみてください。