• 締切済み

awkで各列の最大値を一気に出力

awkで各列の最大値と最小値を一気に出力する方法を教えてください。特定の列に対する処理はできますが、全ての列について処理する方法が知りたいです。

みんなの回答

回答No.1

質問に対する直接の回答としては、 特定の列($1とか$2とか)で処理が出来る状態であるのなら、 1とか2の部分は変数を使うことが出来るので、 > for ( i = 1 ; i <= NF ; ++i ) { > # このループの中で $1とか$2の代わりに$iを使う。 > } のようにすれば良いと思います。 作ってみたawkのスクリプトと実行結果を載せます。 列数が不明な場合でも処理できるようにしたり、 それぞれの行ごとに列数が不揃いだった場合でも、少ない列のところは無視するようにしてありますが、そのへんがあらかじめ決めておけるならもうちょっと簡略化出来ると思います。 ##### スクリプト ##### $ cat minmax.awk #! /usr/bin/awk -f { # 使用されている最大列を覚えておく if ( fmax < NF ) { fmax = NF } # すべての列ループする for ( i = 1 ; i <= NF ; ++i ) { if ( init_apper[ i ] == 0 ) { # 始めて出現した列は、比較なしに最小値,最大値とする init_apper[ i ] = 1 min[ i ] = $i max[ i ] = $i } else { # 最大値と最小値の更新 if ( min[ i ] > $i ) { min[ i ] = $i } if ( max[ i ] < $i ) { max[ i ] = $i } } } } END { # メインループで調べた結果を出力する。 # 列ごとの最小値を出力する。 printf "min:" for ( i = 1 ; i <= fmax ; ++i ) { printf " " min[ i ] } print "" # 列ごとの最大値を出力する。 printf "max:" for ( i = 1 ; i <= fmax ; ++i ) { printf " " max[ i ] } print "" } ###### 以下実行結果 ##### $ cat test1.txt 80 75 33 65 73 73 65 76 81 95 63 50 55 63 80 100 90 60 50 88 $ awk -f minmax.awk test1.txt min: 63 50 33 50 73 max: 100 90 76 81 95 $ cat test2.txt 10 20 30 40 50 100 200 300 400 500 230 250 $ awk -f minmax.awk test2.txt min: 10 20 30 40 50 max: 230 250 300 400 500

関連するQ&A