Linux / コマンド / sort - テキスト行の並べ替え

sortは入力ファイルの行を比較して、整列された結果を標準出力に送ります。名前順の整列だけでなく、数字、特定のフィールド、逆順の整列が必要なときにも使用します。

既定の並べ替えはロケール(言語や地域の規則)の文字比較に従います。結果は標準出力へ送られ、入力内容はそのままです。再現可能な順序が必要なら、LC_ALL=C sort names.txt のように、そのコマンドに対してCロケールの比較規則を明示します。日本語の読み順に並べ替える指定ではありません。

基本的な文法

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

インストールされている実装とオプションは、配布版によって異なる場合があります。man sortで現在のシステムの説明を確認してください。

使用例

基本的な整列

一行を一つのレコードとして読み込み整列します。出力はファイルを変更しません。

sort names.txt

数値を基準に並べ替える

通常の文字列比較では10が2より前に来ることがあるため、数値の大小では -n を使います。先頭の + や指数表記は -n の通常の数値として解釈されません。指数表記などには -g が使えますが、浮動小数点への変換による精度の違いにも注意してください。

sort -n scores.txt

2番目のフィールドを基準に並べ替える

空白で区切られたデータの2番目のフィールドを数値として比較します。番号は1から数え、-k2,2 は2番目だけを指定します。-k2 と終了位置を省略すると行末までがキーになるため、範囲を明示する方が意図が明確です。各例のファイルは、示した形式の練習用データとして用意してください。

sort -k2,2n results.txt

入力とソート結果を一緒に確認する

次の例はファイルを作らずに標準入力の3行をソートします。基本のソートは現在のロケールの文字順に従い、元のデータは変わりません。

printf 'zebra\napple\nbanana\n' | sort

例の出力:

apple
banana
zebra

数字を含む行は基本的に文字列として比較されるため、2より10が前に来ることがあります。数値比較が目的の場合はsort -nを使用してください。ファイルをソートして新しいファイルに保存するには、出力パスをsort オリジナル > 結果のように指定し、同じファイルに直接リダイレクトしないでください。シェルが入力ファイルを先に空にする場合があります。

複数の列を基準にソートする場合は各キーの範囲を明示し、同じキーの元の順序を維持する必要がある場合は-sを確認してください。ロケールが異なると文字のソート順も変わる可能性があるため、再現可能なスクリプトではLC_ALL=Cのような比較環境を明確に指定します。

主なオプションと形式

オプション・形式 説明
-n 数値で比較します。
-r 結果の順序を逆にします。
-k 開始,終了 比較するキー・フィールドを指定します。
-u ソートしながら、同じ比較キーの重複結果を1つだけ残します。
-t 区切り文字 フィールド区切り文字を指定します。

使用する際の注意点

指定した比較キーが等しければ、sort -u は他の列が違う行も1つにまとめます。元の出現順を保ち、隣接した同一行だけを取り除く場合はuniqコマンドによる重複行の整理を使います。-t は区切り文字で列を分ける指定で、引用符付きのカンマなどを解釈するCSV専用パーサーではありません。結果を元の入力へ > で直接保存すると、シェルが入力を先に空にするため避けてください。

よくある質問

ソート結果を元のファイルに保存しますか?

GNU sortではsort -o names.txt names.txtを使用することができます。重要なファイルはまずバックアップしてください。

公式ドキュメント

オプションの正確な動作と実装ごとの差異は、sortに関する公式ドキュメントで確認できます。