awkのif文は、if, else if, elseを組み合わせて、条件毎に処理を分けることができます。条件式には、一致判定・大小比較・パターンマッチなどを指定します。
awkの書式は自由度が高く、改行省略や2項演算子を使うと、条件分岐をより簡潔に書くことができます。
awk if 文の書き方
if・else ifに続くカッコに条件式を書き、続けて「条件を満たしたときの処理」を書きます。
「条件を満たさないときの処理」が必要なら、else キーワードの後に書きます。
1ライナーで書く場合、if・elseは「;」で区切ります。
実行する処理が複数になる場合は、中括弧{}で囲みます。
awk スクリプトファイル
# sample.awk { if ( expression ) action else if ( expression ) { action1 action2 } else action }
# スクリプトファイルを実行 $ awk -f sample.awk data.txt
awk ワンライナー
$ cat data | awk '{ if ( expression ) action1; else action }'
awk if 使い方
if – 単純な分岐
awkのifだけを使ったサンプルです。ファイル内に空白行があるかを調べています。
指定した条件を満たした場合のみ処理を実行します。
ifで指定した条件「if ($1 ~ ^$)」で、空白行を探します。
空白行が存在した場合に「blank line」と表示しています。
NRを使って、該当する行番号も一緒に表示しています。
# テストファイル $ cat > test.txt << EOF a b c EOF
# awk スクリプト - awk_if.awk { if ($1 ~ /^$/) print "blank line", NR } $ awk -f awk_if.awk test.txt blank line 3
# awk ワンライナー $ cat test.txt | awk '{if ($1 ~ /^$/) print "blank line", NR}' blank line 3
else – 条件に合うとき・条件に合わないとき
awkのif、elseを使ったサンプルです。ファイル内に空白行があるかを調べています。
指定した条件を満たした場合、条件を満たさない場合の処理を実行します。
ifで指定した条件「if ($1 ~ ^$)」で、空白行を探します。
空白行でない場合の動作は「else」で指定しました。
空白行が存在した場合に「blank line」と表示しています。
そうでない場合は、行全体を print で表示しています。
# テストファイル $ cat > test.txt << EOF a b c EOF
# awk if スクリプト - awk_if-else.awk { if ($1 ~ /^$/) print "blank line" else print } $ awk -f awk_if-else.awk test.txt a b blank line c
# awk ワンライナー $ cat test.txt | awk '{if ($1 ~ /^$/) print "blank line"; else print}' 結果省略
else if – 条件を加える
awkのif、else if、elseを使ったサンプルです。ファイル内に空白行があるかを調べています。
指定した複数の条件を満たした場合、条件を満たさない場合の処理を実行します。
ifで指定した条件「if ($1 ~ ^$)」で空白行、else ifで指定した条件「if ($1 ~ ^#)」でコメント行を探します。
どちらでもない場合の動作は「else」で指定しました。
空白行は「blank line」、コメント行は「comment line」と表示しています。
そうでない場合は、行全体を print で表示しています。
# テストファイル $ cat > test.txt << EOF a #b c EOF
# awk if スクリプト - awk_else-if.awk { if ($1 ~ /^$/) print "blank line" else if ($1 ~ /^#/) print "comment line" else print } $ awk -f awk_else-if.awk test.txt a comment line blank line c
# awk ワンライナー $ cat test.txt | awk '{if ($1 ~ /^$/) print "blank"; if ($1 ~ /^#/) print "comment"; else print}' 結果省略
awk if の 条件判定
awkのif文、および、else ifの条件式には、一致・大小比較・パターンマッチなどを指定することができます。
一致を調べる
awkのif文で、一致をチェックします。
行番号を引数で渡して、指定した行番号の行だけ表示します。
ifで指定した比較の条件は「if (NR == line)」で、現在の行番号と指定した行番号を比較しています。
引数で2を指定したので、ファイルの2行目だけ表示されます。
# テストファイル $ cat > test.txt << EOF a b c d EOF
# awk ワンライナー $ cat test.txt | awk -v line=2 '{if (NR == line) print}' b
大小比較を調べる
awkのif文で、大小比較をチェックします。
行番号を引数で渡して、指定より大きな行番号の行だけ表示します。
ifで指定した比較の条件は「if (NR > line)」で、現在の行番号と指定した行番号を比較しています。
引数で2を指定したので、ファイルの3行目・4行目だけ表示されます。
# テストファイル $ cat > test.txt << EOF a b c d EOF
# awk ワンライナー $ cat test.txt | awk -v line=2 '{if (NR > line) print}' c d
文字列のパターンを調べる
awkのif文で、正規表現を使ってパターンマッチをチェックします。
正規表現を使って、以下のような条件を指定することができます。
- 先頭がa : if ($1 ~ ^a)
- 末尾がd : if ($1 ~ d$)
- 先頭がa または b : if ($1 ~ ^[ab])
- 先頭がa または b の否定 : if ($1 ~ [^ab])
# テストファイル $ cat > test.txt << EOF a b c d EOF
# 先頭がa $ cat test.txt | awk '{if ($1 ~ /^a/) print}' a # 末尾がd $ cat test.txt | awk '{if ($1 ~ /d$/) print}' d # 先頭がaかb $ cat test.txt | awk '{if ($1 ~ /^[ab]/) print}' a b # 先頭がaまたはbでない $ cat test.txt | awk '{if ($1 ~ /[^ab]/) print}' c d
awk if 短く簡潔に書く
awkのif文は、短くすっきりと書けます。
単純な分岐は、改行を省略して書いたり・2項演算子を使うことで、単純な分岐を見通しよく書けます。
if 改行を省略して簡潔に短く書く
単純なif文は改行を省略して、代わりにセミコロン(;)で処理を区切って書くと、簡潔に書けます。
ワンライナーで書くときと同じように書けます。
# テストファイル $ cat > test.txt << EOF a b c EOF
# awk if スクリプト - awk_short.awk { if ($1 ~ /^$/) print "blank line"; else print } $ awk -f awk_short.awk test.txt a b blank line c
# awk ワンライナー $ cat test.txt | awk '{if ($1 ~ /^$/) print "blank line"; else print}' 結果省略
2項演算子を使って簡潔に短く書く
単純なif文は、2項演算子で書くと更に簡潔に書けます。
判断部分は「($1 ~ ^$) ? action1 : action2」です。
「?」の前の条件式を満たせば「action1」を実行し、条件式を満たさなければ「action2」を実行します。
条件を満たしたときは”blank”、満たさないときは$0(行全体)を表示します。
# テストファイル $ cat > test.txt << EOF a b c EOF
# awk if スクリプト - awk_short2.awk { print ($1 ~ /^$/) ? "blank" : $0 } $ awk -f awk_short2.awk test.txt a b blank c
# awk ワンライナー $ cat test.txt | awk '{print ($1 ~ /^$/) ? "blank" : $0}' 結果省略
awk if 文の書き方 – まとめ
- awkのif条件文は、条件によって処理をわけたいときに使う。
- 条件式は、0の判定・関係演算子・パターンマッチなどを使って書く。
- 省略記法や条件演算子を使えば、awkのif文をより簡潔に書ける。
実験データの解析や論文用グラフ作成のヒントになりそうな、プログラミング・統計処理の参考になる書籍をまとめて紹介しています。是非、参考にしてみて下さいね。
論文・データ解析の支援
個別に直接相談できるのが良いと、たくさんの方にご利用頂いています。