【Linux】csvのようなカンマ区切りのファイルを特定の要素でソートする

Linuxコマンド シェルスクリプト

やりたいこと

果物の名前と金額が記載されたファイルがある。

apple,300
banana,210
orange,330

これを下記のように金額の大きい順で並び替えを行い、表示したい。

orange,330
apple,300
banana,210

実際の業務では、「バッチ処理のログファイルから処理時間が遅い順に並び替えたい」ということが考えられる。

考え方

このような場合、sortコマンドのオプションを活用することで解決できる。

利用するオプションは下記の通りだ。

  • -t:フィールドの区切り文字を指定する(デフォルトは空白文字)
  • -k:並び替えの要素と、後続するオプションでどのように並び替えるかを指定する
  • -n:文字列を数値とみなして並び替えを行う
  • -r:逆順で並び替える

次の手順で実施する。

  1. カンマ区切りで並び替えを行い、並び替え対象の要素を決定する
  2. 文字列を数値として並び替えを行うようにする
  3. デフォルトが昇順なので、降順で並び替えるようにする

カンマ区切りで並び替えを行う

$ 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
タイトルとURLをコピーしました