sort
Bashなどの配列そのものにはソート機能が無いので、 外部コマンドを使って一度書き出してソートして書き直し、的な事をします。
通常LinuxやMacなんかだとsort
コマンドがあるのでこれを使います。
sort
は行のソートになるので、書き出しを1行ずつにしてあげて
それをまた入れなおす事が必要です。
空白などがある場合を考えると、一行毎に、ということを行うこともあるので、
IFS
を改行にしておけば簡単に出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
こんな感じでarray2
の右辺の様にソートしてあげれば
1
$ ./sort.sh
arr1
bbb aaa ccc a b
arr2
a b aaa bbb ccc
a b
aaa
bbb
ccc
と、空白がある場合でも正しくソートされます。
もし、空白がないことが確実な場合ははもっと簡単に
arr2=($(for v in "${arr1[@]}"; do echo "$v"; done|sort))
$ arr1=(100 22 324 -1 3 0 -30)
$ arr2=($(for v in "${arr1[@]}"; do echo "$v"; done|sort -n))
$ for i in ${arr2[@]};do echo $i;done
数字のソートをしたいときは、sort
の数字をソートする-n
オプションを使って
arr2=($(for v in "${arr1[@]}"; do echo "$v"; done|sort -n))
とすればOK。
$ arr1=(100 22 324 -1 3 0 -30)
$ arr2=($(for v in "${arr1[@]}"; do echo "$v"; done|sort -n))
$ for i in ${arr2[@]};do echo $i;done
$ arr1=(100 22 324 -1 3 0 -30)
$ arr2=($(for v in "${arr1[@]}"; do echo "$v"; done|sort -n))
$ for i in ${arr2[@]};do echo $i;done
-30
-1
0
3
22
100
324
$
Sponsored Links
-
ここでは
IFS
が改行なので"${arr[*]}"
と*
を使った場合に""
で囲うと、全項目がIFS
で繋げられた一つの文字列、 と解釈されるので1行に1項目の出力になります。一方、
"${arr[@]}"
としてしまうと、それぞれの項目が1つずつ順番に 区別して表示されるのですが、この時、それぞれの間にはIFS
の値によらず 表示上はスペースが挿入されます。"
で囲わない場合は@
でも*
でも単にスペースが各項目に挿入された形で 表示されます。なので、上の様な形で配列の要素を1行毎に表示させたい場合には
*
かつ全体を"
で囲う、ということが必要になります。 ↩