あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

awk弄り

目にすることはあるんだけれど、使ったことがないコマンドって結構あるので気がついたときに慣らしてみることにした。

awkとは

perlrubyのようなスクリプト言語。簡単なテキスト処理+計算処理には効率がいい。

awkの構文

awkは実行式を一行ずつ{ }で囲む。渡されたデータの各行に対して式を実行していく。

echo "1 2 3 4" | gawk '{  a = $0 } { print a }'

1 2 3 4

echo "1 2 3 4\n1 2 3 4" | gawk '{  a = $1 } { print a }'

1
1

行を半角スペースで区切っていき、順番に変数($1,$2...)に代入していく。一行をそのままとりあつかうには$0を指定する。

「#」が付くと以降はコメントになる。

echo "1 2 3 4" | gawk '{print $2} # $1 =  "1", $2 = "2 3", $3 = "4", $0 = "1 2 3 4"'

2 3

変数をならべてprintすると結合表示する。各変数間にスペースを入れたい場合は、「,」で変数を繋ぐ。

echo "1 2 3 4" | gawk '{print $1 $2,$3} # $1 = "1", $2 = "2 3" , $3 = "4", $0 = "1 2 3 4"'

12 3 4

BEGIN〜ENDの定義が存在する場合、BEGINで定義した式が一度行われると、渡される行の分だけEND以前の式を実行して、その後ENDで定義した式を実行する。

echo "1\n1\n1" | gawk 'BEGIN { a = 1 } { a += $1 } END { print a } # "a = 1"がBEGIN定義、 "print a "がEND定義'

4

特定の文字が含まれている行に対して式を実行する場合は、特定文字を/で囲んで、式を定義する。

echo "1\n1\n123" | gawk '/23/{ print $0 }'

123