sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定もコマンド


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドP-T, テキスト処理コマンド > sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定もコマンド
「sortコマンドで並び替えたら、数値の順番がおかしい」
「CSVの特定の列でソートしたいけど、やり方がわからない」

Linuxのsortコマンドは、テキストデータの並び替えに欠かせないコマンドです。ログ解析、設定ファイルの確認、データの集計など、サーバー管理のあらゆる場面で使います。

この記事では、sortコマンドの基本から、数値ソート・フィールド指定・重複削除まで、実務で必要になるオプションをすべて解説します。「100が2より前に来る」という初心者がハマりやすい落とし穴と、その対処法もしっかり押さえましょう。

sortコマンドとは?テキストを行単位で並び替える

sortコマンドは、テキストファイルの内容や標準入力を行単位で並び替えて出力するコマンドです。

デフォルトでは、各行の先頭文字からアルファベット順(辞書順)で昇順に並び替えます。元のファイルの内容は変更されず、結果は標準出力(画面)に表示されます。

主な用途は以下のとおりです。

ログファイルの整理:アクセスログやエラーログを特定の項目で並び替える
設定ファイルの確認:/etc/passwdをUID順にソートしてユーザーを一覧する
データの集計:sort | uniq -c で重複行をカウントする
ディスク使用量の調査:du の出力をサイズ順に並び替えて、大きなディレクトリを特定する

sortは単体でも便利ですが、パイプ( | )で他のコマンドと組み合わせることで真価を発揮します。

sortコマンドの基本的な使い方

1. ファイルをアルファベット順に並び替える

もっとも基本的な使い方です。ファイル名を引数に指定するだけで、各行がアルファベット順(昇順)に並びます。

# ファイルの内容を昇順で表示 sort ファイル名

たとえば、fruits.txt に以下の内容が入っているとします。

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

-n なしでソートすると、こうなります。

$ sort numbers.txt 100 2 30 5

「100」が「2」より前に来ています。これは、sortがデフォルトでは文字列として辞書順に比較するからです。文字列比較では先頭の「1」が「2」より小さいと判定されるため、「100」が先に来ます。

数値として正しくソートするには、-n(numeric)オプションを付けてください。

# 数値としてソート(昇順) $ sort -n numbers.txt 2 5 30 100

数値の大きい順に並べたい場合は、-n と -r を組み合わせます。

# 数値の降順でソート sort -nr numbers.txt

特定のフィールドでソートする(-k と -t オプション)

実務では、CSVや区切り文字付きのデータを特定の列で並び替えたい場面が多くあります。sortコマンドでは、-t で区切り文字を指定し、-k でソート対象のフィールド番号を指定します。

1. 基本的なフィールド指定

# -t で区切り文字を指定、-k でフィールド番号を指定 sort -t '区切り文字' -k フィールド番号 ファイル名

フィールド番号は1から始まります。たとえば、カンマ区切りのCSVで3番目の列を基準にソートする場合はこうです。

# 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

この例は、-t(区切り文字)、-k(フィールド指定)、-n(数値ソート)の3つを同時に使う典型的なパターンです。実務でもよく使うので覚えておきましょう。

3. フィールド範囲を指定する

-k オプションでは、開始フィールドと終了フィールドを指定できます。

# 2番目のフィールドのみを基準にソート sort -t, -k2,2 data.csv # 2番目のフィールドを数値としてソート sort -t, -k2,2n data.csv

-k2 だけだと「2番目のフィールドから行末まで」がソートキーになります。特定のフィールドだけでソートしたい場合は -k2,2 のように終了フィールドも指定してください。

重複行を削除する(-u オプションとuniqコマンド)

1. -u オプションで重複を除去する

-u(unique)オプションを付けると、ソート後に同じ内容の行を1つにまとめて出力します。

# 重複行を除去して表示 sort -u fruits.txt

先ほどのfruits.txtの例では、「apple」が2行ありましたが、-u を付けると1行だけ出力されます。

2. sort | uniq の組み合わせ

重複行のカウントが必要な場合は、sort と uniq -c を組み合わせます。uniqコマンドは連続する同じ行を処理するため、事前にsortで並び替えておく必要があります。

# 重複行をカウントして多い順に表示 sort access.log | uniq -c | sort -nr

このパターンは、アクセスログのIPアドレス集計やエラーの発生頻度調査など、ログ解析の定番です。

実務で役立つsortの応用テクニック

1. ディスク使用量をサイズ順に表示する

du コマンドと組み合わせて、ディレクトリのサイズを大きい順に表示できます。-h(human-readable)オプションを使えば、K・M・Gの単位付きでも正しくソートされます。

# カレントディレクトリ配下のサイズを大きい順に表示 du -sh * | sort -rh

-h オプションはGNU sort(Linuxの標準)で使えます。K(キロバイト)、M(メガバイト)、G(ギガバイト)の単位を認識して、正しい大きさの順に並べてくれます。

2. 同じファイルにソート結果を上書きする(-o オプション)

通常、リダイレクトで同じファイルに書き込もうとすると、ファイルの中身が空になってしまいます。

# これはNG - ファイルが空になる sort file.txt > file.txt

-o オプションを使えば、安全に同じファイルへ上書きできます。

# 安全に同じファイルへソート結果を上書き sort -o file.txt file.txt

sortコマンドは内部で一時ファイルを使って処理するため、入力と出力が同じファイルでも問題ありません。

3. 先頭の空白を無視してソートする(-b オプション)

フィールドの先頭に空白(スペースやタブ)が含まれていると、意図どおりにソートされないことがあります。-b(ignore-leading-blanks)オプションで先頭の空白を無視できます。

# 先頭の空白を無視してソート sort -b ファイル名

「ソート結果がおかしい」時のトラブルシュート

1. ロケール(locale)の影響で並び順が変わる

Linuxのsortコマンドは、環境変数のロケール設定によって並び順が変わります。日本語環境(ja_JP.UTF-8)では、英語環境とは異なる照合順序(しょうごうじゅんじょ)が使われるため、期待どおりの結果にならないことがあります。

確実にバイト値の順序でソートしたい場合は、LC_ALL=C を指定してください。

# ロケールをCに設定して、バイト値順でソート LC_ALL=C sort ファイル名

特にスクリプト内でsortを使う場合は、環境に依存しないように LC_ALL=C を付けておくのが安全です。

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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る