【Linux】sortコマンドの使い方|数値順や特定列で並び替える方法

【Linux】sortコマンドの使い方|数値順や特定列で並び替える方法

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:5,195

LinuxのsortコマンドでテキストやCSVデータを並び替える方法を解説します。数値順(-n)や降順(-r)、区切り文字と特定列の指定(-t・-k)、単位付きサイズ順(-h)などの主要オプションから実務での注意点まで、実機出力とともに詳しく紹介します。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル環境でログファイルやCSVCSV [シーエスブイ]Comma-Separated Values。カンマ区切りのデータ形式データを調査・集計する際、「数値の大きい順に並び替えたい」「特定の列(フィールド)だけを基準にソートしたい」「du コマンドの出力をファイルサイズ順に整列したい」といった場面は頻繁にあります。しかし、オプションを指定せずに sort コマンドを実行すると、数値が文字列(辞書順)として扱われてしまい、10 が 2 より先に並ぶなど意図しない結果になることがあります。

本記事では、Linuxの sort コマンドの基本的な使い方から、数値順・降順・特定列での並び替え、人間が読みやすい単位(K・M・G)やバージョン番号順のソート、さらに実務で陥りやすい注意点までを実機の出力結果とともに解説します。

この記事を読むことで、データの形式や目的に応じた適切なオプションを選択し、ログ解析やデータ整形を正確かつ効率的に行えるようになります。

確認した環境

本記事で解説するコマンドや動作は、以下の環境で確認しています。

Terminal window
# AlmaLinux 9.4 でのバージョン確認結果
$ sort --version
sort (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.

Linuxのsortコマンドとは?基本的な構文と主要オプション

結論として、sort コマンドはファイルや標準入力から受け取ったテキストを行単位で比較し、指定した基準で並び替えて標準出力へ表示するコマンドです。元のファイル自体は変更しないため、安全に並び替え結果を確認できます。

sortコマンドの基本構文

基本的な構文は以下の通りです。

Terminal window
sort [オプション] [ファイル名...]

[ファイル名...] を省略した場合は標準入力からデータを読み込みます。パイプ(|)を使って他コマンドの出力結果を直接並び替える用途でも広く利用されます。

よく使う主要オプション一覧

実務でよく利用する代表的なオプションを以下の表にまとめます。

オプション長い形式役割・動作内容
-n--numeric-sort文字列の先頭にある数値を「数値の大きさ」として比較し並び替える
-r--reverse並び替えの順序を逆順(降順)にする
-k--key=KEYDEF並び替えの基準とする列(フィールド)の位置や範囲を指定する
-t--field-separator=SEP列(フィールド)を区切る文字を指定する(デフォルトは空白文字と非空白文字の境界)
-u--unique並び替えと同時に、比較キーが同一の重複行を1行にまとめる
-s--stable同じソートキーを持つ行の入力順を維持する(安定ソート)
-h--human-numeric-sort2K、500M、1.2G などの単位付き数値をサイズ順に並び替える
-V--version-sortテキスト内のバージョン番号や数値を自然な順序で並び替える
-f--ignore-case英字の大文字と小文字を区別せずに比較する
-o--output=FILE並び替え結果を標準出力ではなく指定したファイルに出力する
-c--check入力データがソート済みか検査する。未ソートの場合は診断メッセージを出力し、終了ステータス 1 を返す
-C--check=quiet-c と同様に検査するが、未ソート時の診断メッセージを出力しない

基本的な並び替え(辞書順・数値順・降順)

結論から述べると、数値を扱う場合は必ず -n オプションを指定し、大きい順に並べる場合は -r オプションを組み合わせます。オプションなしの sort は行頭から1文字ずつ文字コード(ロケールの照合順序)で比較するため、桁数の異なる数値は意図通りに並びません。

オプションなし(辞書順)と数値順(-n)の違い

たとえば、10、2、1、20 という4行のデータをオプションなしで sort に渡すと、先頭の1文字目(1 と 2)が先に比較されるため、10 が 2 より前に出力されます。

Terminal window
# オプションなし(文字列・辞書順として比較される)
$ printf "10\n2\n1\n20\n" | sort
1
10
2
20

数値の大きさとして昇順(小さい順)に並び替えるには、-n(--numeric-sort)を指定します。

Terminal window
# -n オプションで数値として昇順ソート
$ printf "10\n2\n1\n20\n" | sort -n
1
2
10
20

降順(大きい順・逆順)に並び替える(-r / -nr)

並び順を逆(降順)にするには -r(--reverse)を指定します。数値を大きい順(ランキング順など)に並べる場合は、-n と -r を合わせて -nr(または -rn)と記述します。

Terminal window
# 数値を大きい順(降順)にソート
$ printf "10\n2\n1\n20\n" | sort -nr
20
10
2
1

注意点: -r 単体では「辞書順の逆順」になるため、数値データに対して sort -r のみを実行すると 20、2、10、1 の順になります。数値の降順ソートでは -nr とセットで指定する習慣をつけるとミスを防げます。

特定の列(フィールド)を基準に並び替える(-t と -k)

CSVファイルや設定ファイル、スペース区切りのテーブルデータなどにおいて特定の列を基準に並び替える場合は、-t で区切り文字を指定し、-k で対象列の範囲を指定します。

-kオプションの正しい指定方法(開始列と終了列)

-k オプションは -k <開始列>,<終了列> の形式で指定するのが基本です。

  • -k 3,3: 3列目のみを基準に比較する
  • -k 3: 3列目から行末までをひとつの文字列として比較する

終了列を省略して -k 3 とだけ記述すると、3列目が同じ値だった場合に4列目以降も含めた文字列全体で比較が行われます。特定の列だけを厳密にソートキーとしたい場合は、-k 3,3 のように開始列と終了列の両方を明記するのが確実です。

CSVファイルの特定列を数値順・複数条件でソートする実例

以下のようなカンマ区切りのファイル servers.csv(1列目: ホスト名、2列目: 拠点名、3列目: コネクション数)を例に確認します。

web01,Tokyo,120
db01,Osaka,45
app01,Tokyo,300
cache01,Fukuoka,80

区切り文字にカンマ(-t',')を指定し、3列目のコネクション数を数値の小さい順(-k3,3n)で並び替えるコマンドは以下の通りです。

Terminal window
$ sort -t',' -k3,3n servers.csv
db01,Osaka,45
cache01,Fukuoka,80
web01,Tokyo,120
app01,Tokyo,300

さらに、「第1優先として2列目(拠点名)を辞書順(昇順)に並べ、同じ拠点内では3列目(コネクション数)を数値の大きい順(降順)に並べる」といった複数条件のソートも、-k オプションを複数並べることで実行できます。

Terminal window
$ sort -t',' -k2,2 -k3,3nr servers.csv
cache01,Fukuoka,80
db01,Osaka,45
app01,Tokyo,300
web01,Tokyo,120

上記のように -k2,2 や -k3,3nr の末尾に n や r を付与すると、コマンド全体ではなく「その列(キー)に対してのみ」数値比較や降順を個別適用できます。

注意点: sort -t',' はカンマを単純な区切り文字として扱うため、ダブルクォーテーション(")で囲まれたフィールド内のカンマや改行を正しく解釈できません。今回の例のような単純なカンマ区切りデータには利用できますが、一般的なCSV仕様に準拠したデータを扱う場合は、CSV形式に対応したツールを使用してください。

特定の列だけを切り出してから集計・加工したい場合は、cut コマンドとの使い分けも有効です。

【Linux】cutコマンドの使い方|区切り文字や文字数で切り出す方法
ITナレッジライフ

【Linux】cutコマンドの使い方|区切り文字や文字数で切り出す方法

Linuxのcutコマンドを使って、ファイルやテキストから特定の列や文字を効率的に切り出す方法を徹底解説。区切り文字(delimiter)の指定方法や文字数での抽出、シェルスクリプトでの実用的な活用例まで、インフラエンジニアやプログラマー必須のテキスト処理テクニックを分かりやすく紹介します。

実務で役立つ便利なソートオプション(-h / -V / -u)

GNU coreutils の sort コマンドには、単純な文字列や数値だけでなく、ファイルサイズ単位やバージョン番号を解釈して並び替えるオプションが備わっています。

単位付きファイルサイズ順に並び替える(-h)

du -sh * や df -h の出力のように、120K、500M、2.5G といった単位(SI接頭辞・二進接頭辞)が付いた数値は、通常の -n では単位文字を解釈できず、数値部分の大小だけで比較されてしまいます。

このようなデータには -h(--human-numeric-sort)を使用します。まず単位(K < M < G < T)の大小を比較したうえで数値部分を比較するため、容量順に正しく整列できます。

Terminal window
$ printf "500M\n2.5G\n120K\n1.2G\n" | sort -h
120K
500M
1.2G
2.5G

実務でディレクトリごとの使用量を大きい順に確認したい場合は、du コマンドとパイプで繋いで du -sh * | sort -hr のように実行すると効率的です(なお、df -h の出力をソートする場合は、1行目のヘッダー行を除外したうえで列を指定する df -h | tail -n +2 | sort -k 2,2hr のような形で組み合わせます)。df や du コマンドの詳しい使い方は以下の記事で解説しています。

【Linux】容量の大きいファイル・ディレクトリを確認する方法
ITナレッジライフ

【Linux】容量の大きいファイル・ディレクトリを確認する方法

Linux でファイルやディレクトリの容量を確認する方法を徹底解説。duやdfの基本から、出力の違いの理由、大容量ファイル・ディレクトリの特定、削除済みファイルの調査まで、容量管理に必要な実践テクニックを紹介します。

バージョン番号やIPアドレスを自然な順序で並べる(-V)

ソフトウェアのタグ(v1.2.0、v1.10.0)やファイル名に含まれる連番などを並び替える際、辞書順ソートでは v1.10.0 が v1.2.0 より先に来てしまいます。

-V(--version-sort)を指定すると、文字列内の連続する数字のかたまりを数値として解釈し、人間にとって自然な順序で並び替えます。

なお、IPv4IPv4 [アイピーブイフォー]インターネットプロトコル第4版。32ビットでIPアドレスを表現するアドレスのような数字とドットで構成された文字列にも利用できますが、IPIP [アイピー]Internet Protocol。インターネット通信の基本プロトコルアドレス専用の比較機能ではないため、厳密なIPアドレスの比較には注意が必要です。

Terminal window
$ printf "v1.10.0\nv1.2.0\nv1.9.0\nv1.2.1\n" | sort -V
v1.2.0
v1.2.1
v1.9.0
v1.10.0

重複行を削除しながら並び替える(-u)と特定列ユニーク化の挙動

-u(--unique)を指定すると、ソート結果から重複する行を取り除き、一意(ユニーク)な行のみを出力します。単純な行全体の重複削除であれば sort sample.txt | uniq と同じ結果を1つのコマンドで得られます。

また、-k オプションと -u オプションを組み合わせた場合、「指定したソートキーの列が同じであれば重複とみなして1行だけを残す」 という動作になります。

Terminal window
# 2列目(拠点名)が同じ行は重複とみなし、入力順を維持して1行のみ残す
$ sort -t',' -k2,2 -s -u servers.csv
cache01,Fukuoka,80
db01,Osaka,45
web01,Tokyo,120

Tokyo の行は web01 と app01 の2行存在していますが、2列目をキーとして -u を適用すると、同じソートキーを持つ行は重複とみなされ、1行のみが出力されます。

なお、GNU sort では -u を指定すると最終段階の行全体比較(last-resort comparison)が無効化されますが、POSIX標準や他環境との互換性を保ち、「入力順を維持して先頭の行を残す」という意図を明確にするために -s(--stable)を明示的に併用するのが確実です。安定ソートによって同じキーを持つ行の入力順が維持されるため、今回の例では web01,Tokyo,120 が残ります。重複行のカウント(uniq -c)や重複行のみの抽出(uniq -d)を行いたい場合は、uniq コマンドと組み合わせて使用します。

【Linux】重複行を削除する方法!sortとuniqの基本と応用
ITナレッジライフ

【Linux】重複行を削除する方法!sortとuniqの基本と応用

本記事では、Linuxでテキストファイルの重複行を削除する代表的な方法を解説します。sortとuniqコマンドを組み合わせた基本手順から、出現回数の集計機能まで詳しく紹介。ログ解析やCSVデータのクレンジング作業を効率化したいエンジニア必見のテクニックをまとめました。

sortコマンドを使う際の実務上の注意点

最後に、シェルスクリプトや本番環境で sort コマンドを利用する際に知っておくべき3つの注意点を解説します。

1. 元ファイルへの上書き保存にはリダイレクトではなく -o を使う

ファイルをソートして同じファイル名に上書き保存したい場合、sort file.txt > file.txt のように標準出力のリダイレクト(>)を使ってはいけません。

シェルは sort コマンドを起動する前にリダイレクト先の file.txt を空(0バイト)に切り詰めてしまうため、ファイルの中身がすべて消えてしまいます。

同一ファイルへ安全に上書き保存する場合は、必ず -o(--output)オプションを使用します。

Terminal window
# NG例:ファイルが0バイトになりデータが消失する
sort file.txt > file.txt
# OK例:sortが全行を読み終えてから安全に書き出す
sort -o file.txt file.txt

2. ロケール(LANG / LC_ALL)による並び順の違い

sort コマンドの比較順序は、実行環境のロケール変数(LC_COLLATE や LC_ALL、LANG)の影響を受けます。

たとえば en_US.UTF-8 や ja_JP.UTF-8 などのロケールでは、辞書順ソート時に大文字・小文字や記号(ハイフンやアンダースコアなど)が混在すると、純粋なASCIIコード順とは異なる順序で並ぶことがあります。

環境による差異をなくし、ロケールに依存しないバイト値順で高速にソートしたい場合や、join コマンドの前処理としてソートする場合は、コマンドの先頭に LC_ALL=C を付与して実行します。

Terminal window
LC_ALL=C sort file.txt

3. デフォルトの区切り文字(空白文字)と -b オプション

-t オプションを指定しない場合、sort は空白文字(スペースやタブ)と非空白文字の境界をフィールドの区切りとして扱います。ただし、行頭や各フィールドの先頭にある空白もフィールドの一部として扱われるため、空白の数によって意図した比較結果にならないことがあります。

空白区切りのデータで行頭・列頭のスペースを無視して比較したい場合は、-b(--ignore-leading-blanks)オプションを指定します。たとえば、-k2b,2 のように指定すると、2列目の開始位置にある空白を無視して比較できます。また、-b -k2,2 または -k2b,2b のように指定すれば、ソートキーの開始位置と終了位置の両方で先頭の空白を無視できます。なお、-n や -h は数値比較時に先頭の空白を許容しますが、フィールドの文字位置を指定する場合の空白処理とは異なるため、必要に応じて -b を明示的に指定してください。

まとめ

本記事では、Linuxの sort コマンドの基本的な使い方から応用オプション、実務での注意点までを解説しました。

  • 数値の並び替え: 文字列(辞書順)ではなく数値として比較するには -n、大きい順(降順)にするには -nr を指定する。
  • 特定列でのソート: -t で区切り文字を指定し、-k <開始列>,<終了列>(例: -t',' -k3,3n)で対象列の範囲と比較方法を明示する。
  • 単位・バージョンの解釈: du -h などの単位付きサイズは -h、バージョン番号や連番は -V で自然な順序に整列できる。
  • 安全なファイル上書きと環境差対策: 同一ファイルへの上書きはリダイレクトではなく sort -o <ファイル名> <ファイル名> を使い、ロケールに依存しないバイト値順でソートしたい場合は LC_ALL=C を指定する。

ログ解析やテキスト検索で組み合わせて使う他のLinuxコマンドについては、以下のまとめ記事もあわせて参考にしてください。

【Linux】テキスト処理・検索コマンドの使い方まとめ
ITナレッジライフ

【Linux】テキスト処理・検索コマンドの使い方まとめ

Linuxのテキスト処理やファイル検索に必須のコマンド(grep, find, sed, awk等)の使い方まとめ。基本からパイプを利用した実践的な組み合わせまで、実務を効率化するテクニックを網羅しています。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top