LoginSignup
7
7

More than 5 years have passed since last update.

配列の最小値を求める

Posted at

正の整数が格納された配列があり、その最小値を求めることを考えます。まずawk厨のわたしとしては、awkを利用する方法が思いつきます。

numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{
    min = $1
    for(i = 2; i <= NF; i++) min = $i < min ? $i : min;
    print min
}'

#=> 11

この書き方のよいところは「配列を先頭からなめていき、最小値を見つけるたびに更新する」という処理の中身が見えやすいところでしょうか。フローの見えやすさは応用のしやすさにもつながります。ただしやや冗長なのは欠点でしょう。

次にsortコマンドを利用する場合は以下のようになります。

numbers=(34 65 112 98 11)
for number in ${numbers[@]}; do
    echo $number
done | sort -n | head -n 1

# => 11

空白区切りの数字を改行区切りに並び替えたあと、昇順に並び替え、最後にその先頭だけを取り出しています。最初の例に比べるとシェルスクリプト感はぐっと強くなりますが、冗長さはあまり変わっていません。awkに依存しないため、awkを可能な限り避けたい人にはお勧めです。

なお上記の例において「空白区切りの数字を改行区切りに並べ替え」る処理をawkに担わせることもできます。

numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{while(++i <= NF) print $i;}' | sort -n | head -n 1

#=> 11

可読性はかなり悪くなりますが、全体としてはかなり短くなります。一行野郎も満足できるはず(´・ω・`)

7
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7