awkには最小値を求める関数は用意されていません。
なので、自分でコーディングする必要があります。

スポンサーリンク

awkで2フィールド(列)目の最小値を求めるサンプルコード

※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
	}

スポンサーリンク