シェルワンライナー ~シェル芸を極める道~ 2歩目

awkによる検索と計算の練習

問 10.正規表現を使って偶数を出力する

[opc@linux ~]$ seq 5 | awk '/[24]$/'
2
4

問 11.C言語のような条件式で偶数を出力する

'$1%2==0'の意味は$1が出力行の1つ目の要素を指す。
ここでは2とか4となる。
そして%2==0は2で割って余り0つまり偶数であることを判定している

[opc@linux ~]$ seq 5 | awk '$1%2==0'
2
4

問 12.出力した値(偶数)から半角スペースを置いて「偶数」と出力する

{printf("%s 偶数\n",$1)}の解説。
引数1個目の%sは引数2個目の$1の入れ場所を指している。

[opc@linux ~]$ seq 5 | awk '$1%2==0{printf("%s 偶数\n",$1)}'
2 偶数
4 偶数

別解

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}'
2 偶数
4 偶数

問 13.条件式を使って全ての値の偶数or奇数を判定し出力する

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}$1%2{print $1,"奇数"}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

==1を入れてOK

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}$1%2==1{print $1,"奇数"}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

問 14.BEGIN構文を使って問13と同じ結果を出力し最後に1から5を合計する

BEGIN,ENDパターンとはawkが1行目の処理を始める前と最終行に処理する内容とそれぞれawkで実行させたい内容を書きます。
ここでのBEGINの{a=0}はaと言う変数を初期化しています。
ENDでは変数aを出力しています。
{a+=$1}は各行の$1の値を足し合わせています。

[opc@linux ~]$ seq 5 | awk 'BEGIN{a=0}$1%2==0{print $1,"偶数"}$1%2{print $1,"奇数"}{a+=$1}END{print "合計",a}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数
合計 15