やりたいこと
果物の名前と金額が記載されたファイルがある。
apple,300
banana,210
orange,330
これを下記のように金額の大きい順で並び替えを行い、表示したい。
orange,330
apple,300
banana,210
実際の業務では、「バッチ処理のログファイルから処理時間が遅い順に並び替えたい」ということが考えられる。
考え方
このような場合、sortコマンドのオプションを活用することで解決できる。
利用するオプションは下記の通りだ。
-t
:フィールドの区切り文字を指定する(デフォルトは空白文字)-k
:並び替えの要素と、後続するオプションでどのように並び替えるかを指定する-n
:文字列を数値とみなして並び替えを行う-r
:逆順で並び替える
次の手順で実施する。
- カンマ区切りで並び替えを行い、並び替え対象の要素を決定する
- 文字列を数値として並び替えを行うようにする
- デフォルトが昇順なので、降順で並び替えるようにする
カンマ区切りで並び替えを行う
$ cat fruits.log | sort -t ',' -k2
banana,210
apple,300
orange,330
「-k2
」を指定することで、カンマ区切りされた2つ目の要素(価格)を基準に並び替えるようになった。
この状態では、価格が文字列としてみなされているので、
先頭の数値から小さい順に並び替えられていることが分かる。
文字列を数値として並び替えを行うようにする
$ cat fruits.log | sort -t ',' -k2n
banana,210
apple,300
orange,330
「-n
」を指定することで、今まで文字列とみなされていた価格が、
数値としてみなされ、小さい順でソートされていることが分かる。
(この例だと文字列ソートと数値ソートの違いが分かりづらいですね…)
並び替えを逆順にする
価格の大きい順で知りたいので、「-r
」オプションを使ってソートのルールを反転させる。
$ cat fruits.log | sort -t ',' -k2nr
orange,330
apple,300
banana,210
これで、価格の大きい順に並び替えることができた。
まとめ
- sortコマンドのオプション「t,k,n,r」はサクッと使えるようにする
- ログ分析中はソートしたい欲が高まるので、覚えておくと結構役に立つ
おまけ
今回の例では文字列ソートと数値ソートが分かりづらかったので補足する。
全ての金額を負の数にしてみた。
apple,-300
banana,-210
orange,-330
このとき、-n
のオプション有無でこのように結果が変わってくる。
# -nオプションを付けないと、数値の小さい順でソートされない
$ cat app.log | sort -t ',' -k2
banana,-210
apple,-300
orange,-330
# -nオプションを付与することで、数値の小さい順でソートされていることが分かる
$ cat app.log | sort -t ',' -k2n
orange,-330
apple,-300
banana,-210