awkには最小値を求める関数は用意されていません。
なので、自分でコーディングする必要があります。
スポンサーリンク
awkで2フィールド(列)目の最小値を求めるサンプルコード
※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-
参考:awk入門-使い方まとめ一覧-
下記のようにin.txtがあった時に2フィールド(列)目の最小値を求めます。
$ cat in.txt category001 60 category001 67 category001 89 category001 34 category002 33 category002 48 category002 6 category002 80
下記がawkで2フィールド(列)目の最小値を求めるサンプルコードになります。
1行ずつ読み込んで、最小値の更新判定をしています。
最後にENDブロックで最小値を出力しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' BEGIN{ initFlag = 1 } { f2 = $2 if(initFlag == 1){ min = f2 #初期値を設定 print "初期値を設定 min=" min initFlag = 0 #初期化終了後フラグをOFF } if(f2 < min){ min = f2 #最小値を更新 print "最小値を更新 min=" min } } END{ print "最小値=" min } '
下記が、実行結果になります。
2フィールド(列)目の最小値が2となっているのが確認できます。
$ ./sample.awk 初期値を設定 min=60 最小値を更新 min=34 最小値を更新 min=33 最小値を更新 min=6 最小値=6
スポンサーリンク
サンプルコードの解説:awkを使った最小値の算出ステップ
まずは初期値の設定が必要
awkの特性上、ブロック処理がレコード(行)単位で繰り返し処理されます。
なので、初期化をするか否かの判定処理をする必要があります。
今回は、フラグを使って、最初にレコード(行)を読み込んだ時に初期化を行いました。
まずは、BEGINブロックでフラグをONにしています。
BEGIN{ initFlag = 1 }
そして、最初のレコード(行)の処理の時に、下記のif文がTRUEとなり、初期化が実行されます。
初期化後は、フラグをOFFにして、初期化以降では初期化されないようにしています。
if(initFlag == 1){ min = f2 #初期値を設定 print "初期値を設定 min=" min initFlag = 0 #初期化終了後フラグをOFF }
スポンサーリンク
1レコード(行)ずつ読み込んで最小値を更新
あとは、1レコード(行)ずつ読み込んで最小値を更新していきます。
if(f2 < min){ min = f2 #最小値を更新 print "最小値を更新 min=" min }
最後に、ENDブロックで最小値をprint出力
最後に、ENDブロックで最終的に更新された最小値をprint出力します。
ENDブロックは、awkコマンドの一番最後に実行されるブロックになります。
END{ print "最小値=" min }
スポンサーリンク