「CSVの特定の列でソートしたいけど、やり方がわからない」
Linuxのsortコマンドは、テキストデータの並び替えに欠かせないコマンドです。ログ解析、設定ファイルの確認、データの集計など、サーバー管理のあらゆる場面で使います。
この記事では、sortコマンドの基本から、数値ソート・フィールド指定・重複削除まで、実務で必要になるオプションをすべて解説します。「100が2より前に来る」という初心者がハマりやすい落とし穴と、その対処法もしっかり押さえましょう。
sortコマンドとは?テキストを行単位で並び替える
sortコマンドは、テキストファイルの内容や標準入力を行単位で並び替えて出力するコマンドです。デフォルトでは、各行の先頭文字からアルファベット順(辞書順)で昇順に並び替えます。元のファイルの内容は変更されず、結果は標準出力(画面)に表示されます。
主な用途は以下のとおりです。
・ログファイルの整理:アクセスログやエラーログを特定の項目で並び替える
・設定ファイルの確認:/etc/passwdをUID順にソートしてユーザーを一覧する
・データの集計:sort | uniq -c で重複行をカウントする
・ディスク使用量の調査:du の出力をサイズ順に並び替えて、大きなディレクトリを特定する
sortは単体でも便利ですが、パイプ( | )で他のコマンドと組み合わせることで真価を発揮します。
sortコマンドの基本的な使い方
1. ファイルをアルファベット順に並び替える
もっとも基本的な使い方です。ファイル名を引数に指定するだけで、各行がアルファベット順(昇順)に並びます。# ファイルの内容を昇順で表示 sort ファイル名
banana apple cherry apple
$ sort fruits.txt apple apple banana cherry
# 結果を別ファイルに保存 sort fruits.txt > sorted.txt
2. 降順に並び替える(-r オプション)
-r(reverse)オプションを付けると、並び順が逆になります。# 降順(Z→A)で表示 sort -r ファイル名
3. 大文字・小文字を区別しない(-f オプション)
デフォルトでは大文字と小文字を区別してソートしますが、-f(fold)オプションで区別をなくせます。# 大文字・小文字を区別せずにソート sort -f ファイル名
数値でソートする(-n オプション)~初心者がハマる落とし穴~
sortコマンドで最もよくある間違いが、数値を含むデータのソートで -n を付け忘れることです。たとえば、以下のようなファイルがあるとします。
100 2 30 5
$ sort numbers.txt 100 2 30 5
数値として正しくソートするには、-n(numeric)オプションを付けてください。
# 数値としてソート(昇順) $ sort -n numbers.txt 2 5 30 100
# 数値の降順でソート sort -nr numbers.txt
特定のフィールドでソートする(-k と -t オプション)
実務では、CSVや区切り文字付きのデータを特定の列で並び替えたい場面が多くあります。sortコマンドでは、-t で区切り文字を指定し、-k でソート対象のフィールド番号を指定します。1. 基本的なフィールド指定
# -t で区切り文字を指定、-k でフィールド番号を指定 sort -t '区切り文字' -k フィールド番号 ファイル名
# CSVの3列目でソート sort -t, -k3 data.csv
2. /etc/passwd をUID順にソートする
/etc/passwd はコロン(:)で区切られており、3番目のフィールドがUID(ユーザーID)です。UID順に並べるには、数値ソート(-n)も組み合わせます。# /etc/passwd をUID(3番目のフィールド)の数値順にソート sort -t: -k3 -n /etc/passwd
3. フィールド範囲を指定する
-k オプションでは、開始フィールドと終了フィールドを指定できます。# 2番目のフィールドのみを基準にソート sort -t, -k2,2 data.csv # 2番目のフィールドを数値としてソート sort -t, -k2,2n data.csv
重複行を削除する(-u オプションとuniqコマンド)
1. -u オプションで重複を除去する
-u(unique)オプションを付けると、ソート後に同じ内容の行を1つにまとめて出力します。# 重複行を除去して表示 sort -u fruits.txt
2. sort | uniq の組み合わせ
重複行のカウントが必要な場合は、sort と uniq -c を組み合わせます。uniqコマンドは連続する同じ行を処理するため、事前にsortで並び替えておく必要があります。# 重複行をカウントして多い順に表示 sort access.log | uniq -c | sort -nr
実務で役立つsortの応用テクニック
1. ディスク使用量をサイズ順に表示する
du コマンドと組み合わせて、ディレクトリのサイズを大きい順に表示できます。-h(human-readable)オプションを使えば、K・M・Gの単位付きでも正しくソートされます。# カレントディレクトリ配下のサイズを大きい順に表示 du -sh * | sort -rh
2. 同じファイルにソート結果を上書きする(-o オプション)
通常、リダイレクトで同じファイルに書き込もうとすると、ファイルの中身が空になってしまいます。# これはNG - ファイルが空になる sort file.txt > file.txt
# 安全に同じファイルへソート結果を上書き sort -o file.txt file.txt
3. 先頭の空白を無視してソートする(-b オプション)
フィールドの先頭に空白(スペースやタブ)が含まれていると、意図どおりにソートされないことがあります。-b(ignore-leading-blanks)オプションで先頭の空白を無視できます。# 先頭の空白を無視してソート sort -b ファイル名
「ソート結果がおかしい」時のトラブルシュート
1. ロケール(locale)の影響で並び順が変わる
Linuxのsortコマンドは、環境変数のロケール設定によって並び順が変わります。日本語環境(ja_JP.UTF-8)では、英語環境とは異なる照合順序(しょうごうじゅんじょ)が使われるため、期待どおりの結果にならないことがあります。確実にバイト値の順序でソートしたい場合は、LC_ALL=C を指定してください。
# ロケールをCに設定して、バイト値順でソート LC_ALL=C sort ファイル名
2. 数値のソートで順番がおかしい
先述のとおり、-n オプションを付け忘れると文字列比較になります。数値データを扱う場合は必ず -n を付けてください。また、数値の前にスペースが入っている場合は、-b オプションも併用しましょう。
# 先頭スペースを無視して数値ソート sort -bn ファイル名
3. フィールド指定のソートが効かない
-k オプションのよくある失敗パターンです。・区切り文字の指定漏れ:-t を省略すると、空白(スペース・タブ)が区切り文字になる。CSVなどでは -t, の指定が必須
・フィールド範囲の未指定:-k2 だけだと2番目のフィールドから行末までがキーになる。特定列だけなら -k2,2 と指定する
・数値フィールドなのに -n を忘れる:-k3 -n または -k3,3n のように数値ソートを指定する
本記事のまとめ
sortコマンドの基本から応用までを解説しました。最も重要なポイントは、数値のソートには必ず -n を付けることです。以下の早見表で、必要なオプションをすぐに確認できます。| やりたいこと | コマンド |
|---|---|
| ファイルを昇順にソート | sort ファイル名 |
| 降順にソート | sort -r ファイル名 |
| 数値として昇順にソート | sort -n ファイル名 |
| 数値の降順にソート | sort -nr ファイル名 |
| 区切り文字と列を指定してソート | sort -t: -k3 -n /etc/passwd |
| 重複行を除去してソート | sort -u ファイル名 |
| 重複行をカウントして多い順に表示 | sort ファイル名 | uniq -c | sort -nr |
| ディスク使用量を大きい順に表示 | du -sh * | sort -rh |
| 同じファイルにソート結果を上書き | sort -o file.txt file.txt |
| ロケールに依存しないソート | LC_ALL=C sort ファイル名 |
sortコマンドだけでなく、Linuxの基礎を体系的に学びませんか?
sortコマンドのようなテキスト処理は、サーバー管理の基本中の基本です。コマンドを断片的に覚えるのではなく、「なぜそのオプションを使うのか」まで理解することで、現場で応用が利くようになります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
