shell, 最大値, 並び替え

やること

例えば以下のようなファイルを考えて、これを1列目の数字が昇順になるように並べます。

sample.txt

13 0.8
48 7.9
33 14.1
63 19.3
25 20.6
14 22.6
29 24.8
68 28
47 32.9
94 35.1

やることはまず1列目の最大値を求めて、次に1列目を並び替えます。

最大値の求め方

次のようなスクリプトで求められます。

 > file="sample.txt"
 > awk '{if(m<$1) m=$1} END{print m}' $file
94

並び替え

得た最大値を利用します。 shellで変数iをforループで回しています。awkの中でも参照するために、awk変数numに代入して用いています。

# sort.sh
N=`awk '{if(m<$1) m=$1} END{print m}' $file`

function spike_sort () {
for i in `seq 0 $N`
do
    awk -v num=$i '$1==num {print $1 " " $2}' $file
done
}

spike_sort

走らせるときはsh sort.shとやって以下のような結果が帰る。

 > sh sort.sh
13 0.8
14 22.6
25 20.6
29 24.8
33 14.1
47 32.9
48 7.9
63 19.3
68 28.0
94 35.1