Next: , Up: Operating on sorted files


7.1 sort: テキストファイルをソート

sortは,与えられたファイル,または与えられない場合や, ‘-’のfileの場合は標準入力からの全ての行を,ソート,統合,ま たは比較します.デフォルトで,sortは結果を標準出力に書き出し ます.概要です.

     sort [option]... [file]...

sortは,処理時に三つのモードがあります.ソート(デフォルト), 統合,そしてソートされてることの調査です.以下のオプションで処理モード を変更します.

-c
--check
与えられたファイルが,すでにソートされているかどうか調査します.全てが ソートされていない場合,エラーメッセージを出力し,1のステータスで終了 します.それ以外の場合は正常に終了します.
-m
--merge
与えられたファイルを,グループ化してソートすることで,統合します.それ ぞれの入力ファイルは,個別にソートされている必要があります.それは常に, 統合ではなくソートのために動作します.統合は,それが動作する状況ではよ り高速なため提供されています.

行の組は,以下のように比較されます.キーフィールドが指定された場合, sortは,それぞれのフィールドの組を,コマンドラインで指定され た順番で,関連する順序オプションで,差が見つかるまで,またはフィールド の残りが無くなるまで比較します.指定されない場合は,すべて比較する際, LC_COLLATEロカールで指定された,文字の順番を使用します. 1

大域的なオプション‘bdfgiMnr’が与えられて,キーフィールドが指定さ れていない場合,sortは大域的なオプションに従い,行全体を比較 します.

最終的に,全てのキーが同じとき(または,順序オプションが全く指定されて いない場合),最後の手段として,sortは行全体を比較します.最 後の手段は,--reverse(-r)の大域的なオプションを尊重 して比較します.--stable(-s)オプションは,この最後の 手段では利用できず,それは,全てのフィールドの比較が同じになる行は,元 の相対的な順序のままにするためです.フィールドや大域的なオプションが指 定されない場合,--stable(-s)は効果がありません.

gnu sortは,(全てのgnuユーティリティで指定されるよ うに)入力行の長さの制限や,行で許可されるバイト数の限界がありません. 更に,入力ファイルの最終バイトが改行でない場合,gnu sortは,黙ってそれを供給します.行の後ろの改行は,比較の目的 では行の一部です.

終了ステータスは以下のようになります.

     
     
     
     0 エラーがない場合
     1 -cオプションとともに呼び出され,入力が適切にソートされていない場合
     2 エラーが生じた場合

環境変数TMPDIRが設定されている場合,sortは,一時ファイ ルのディレクトリとして,/tmpの代わりにその変数をディレクトリと して使用します.--temporary-directory(-T)オプション は,順序的に環境変数に優先します.

以下のオプションは,出力行の順序に影響します.それらは,大域的,または キーフィールドの一部として指定してもかまいません.キーフィールドが指定 されていない場合,大域的なオプションは行全体の比較に対して適用されます. それ以外では,大域的なオプションは,それ自身オプションが指定されていな いキーフィールドに継承されます.以前のPOSIXのバージョンの sortでは,大域的なオプションはキーフィールドだけに影響するの で,移植性の高いシェルスクリプトでは大域的なオプションを最初に指定すべ きです.

-b
--ignore-leading-blanks
それぞれの行でソートするキーを探すとき,前の空白を無視します. LC_CTYPEロカールで文字形式を決定します.
-d
--dictionary-order
phone directoryの順序でソートします.ソート時に,文字,数字,そ して空白以外の全ての文字は無視されます.LC_CTYPEロカールで文字形 式を決定します.
-f
--ignore-case
比較時に,小文字を大文字と同じに扱い,例えば,‘b’と‘B’は同等 にソートされます.LC_CTYPEロカールで文字形式を決定します.
-g
--general-numeric-sort
それぞれの行のプレフィクスを倍精度浮動小数点の数に変換するため,標準C 関数strtodを使用し,数値的なソートをします.これで, 1.0e-3410e100のような浮動小数点の数を,科学的な表記方 で指定できます.LC_NUMERICロカールで小数点文字を決定します.オー バーフローや,アンダーフロー,変換エラーは報告しません.以下の順番を使 用します.

他に選択肢が無い場合のみ,このオプションを使用してください. --numeric-sort(-n)よりはるかに遅く,浮動小数点に変換 するとき,情報を失うはずです.

-i
--ignore-nonprinting
印刷不可能な文字を無視します.LC_CTYPEロカールで文字形式を決定し ます.このオプションは,より強力な--dictionary-order (-d)オプションも与えられている場合,効果がありません.
-M
--month-sort
任意の量の空白から成り立つ最初の文字列に月の名前の省略が続くものは,大 文字のまま保持され,‘JAN’ < ‘FEB’ < ... < ‘DEC’の順 に比較されます.無効な名前は,有効な名前の下になります.LC_TIME ロカールで,月のつづりを決定します.
-n
--numeric-sort
数値的なソートです.数字でそれぞれの行を開始します.特に,オプションの 空白,オプションの‘-’記号,そして,1000で区切られたり,小数点文字 とゼロ以上の桁を続けることが可能な,ゼロ以上の桁から成り立ちます. LC_NUMERICロカールで,小数点文字と1000の区切りを指定します.

数値的なソートは,浮動小数点の数値を表現する文字列を比較するため,慣習 的とは思われない手法を使用します.最初にそれぞれの文字列をCの double形式に変換してそれらの値を比較するのではなく, sortは,二つの文字列の小数点文字を一列に並べて,一度に文字の 列を比較します.このアプローチを使う一つの利益は速度です.実際には,二 つの対応する文字列を倍精度浮動小数点に(または,文字列を整数に)変換し, 倍精度浮動小数点を比較するより効率的です.更に,精度による損失はありま せん.それぞれの文字列を比較前にdoubleに変換すると,ほとんどの システムで16桁程度に精度が制限されるでしょう.

前置される‘+’も,指数表記も認識されません.そのような文字列を数値 的に比較するために,-gオプションを使用してください.

-r
--reverse
比較の結果を逆順にし,より大きなキー値を持つ行が,出力では後方なるので はなく,前方に現われるようになります.

その他のオプションは以下の通りです.

-o output-file
--output=output-file
標準出力の代わりに,output-fileに出力を書き出します.必要があれ ば,sortoutput-fileを開く前に入力を読み込むので, sort -o F Fcat F | sort -o Fのようなコマンドを使用する ことで,同じファイルを安全にソートすることが可能です.

より新しいシステムでは,POSIXLY_CORRECTが設定されている場合, -oを入力ファイルの後に書くことができません.例えば, ‘sort F -o F’です.移植性の高いスクリプトでは,すべての入力ファイ ルの前に-o output-fileを指定すべきです.

-s
--stable
条件によっては実行される最後の手段の比較を利用不可能にし, sortを安定させます.デフォルトで,コマンドラインオプションに よって影響する順番として行の比較が同じになるとき,行全体をキーとして, 順序付けオプションが指定されていない状態で,最後の手段の比較 (last-resort comparison)を使用して,これらの行に順番を付けます.しか し,順序指定として--reverse (-r)が指定されている場合, 最後の手段の比較は--reverseを使用します.あらゆる状況で,順序 付けオプションが指定されていないときや,--reverseだけが指定さ れているとき,最後の手段の比較は実行されません.
-S size
--buffer-size=size
与えられたsizeのメインメモリのソートバッファを使用します.デフォ ルトで,sizeは1024バイト単位です.‘%’を追加すると, sizeを物理メモリのパーセントとして解釈します.‘K’を追加する と,sizeを1024倍(デフォルト)にし,‘M’は1,048,576倍, ‘G’は1,073,741,824倍などのようになり,以下‘T’,‘P’, ‘E’,‘Z’,そして‘Y’も同様です.‘b’を追加すると, sizeは倍数表現ではなくバイト数として解釈されます.

このオプションで,デフォルトより大きいまたは小さいソートバッファを用い て開始させることで,sortのパフォーマンスの改善することが可能 です.しかし,このオプションは初期のバッファサイズだけに影響します. sizeより大きな入力行をsortが見つけた場合,バッファは size以上に大きくなります.

-t separator
--field-separator=separator
それぞれの行からソートキーを検索するとき,フィールドセパレータとして, 文字separatorを使用します.デフォルトで,フィールドは,空白でな い文字と空白文字の間の空の文字列で分離されます.すなわち,入力行 ‘ foo barが与えられた場合,sortはそれを,フィール ド‘ fooと‘ barに分離します.フィールドセパレータは, フィールドの前やフィールドの後の部分とは考えられません.しかし, -k 2のように行末まで展開されるソートフィールドや,-k 2,3のように範囲があるソートフィールドは,範囲の終点に存在するフィール ドセパレータを保持します.

フィールド分離文字としてゼロバイト(ASCII nul (Null)文字) を指定するために,二文字の文字列‘\0’,例えば‘sort -t '\0'’を 使用して下さい.

-T tempdir
--temporary-directory=tempdir
一時ファイルを保存するためディレクトリtempdirを使用し,それは TMPDIR環境変数に優先します.このオプションが一回以上与えられた場 合,一時ファイルはすべて与えられたディレクトリに保存されます.入出力が 拘束されるほどの大量のソートやマージを行なう場合,異なるディスクやコン トローラにあるディレクトリを指定するためにこのオプションを使用すること で,パフォーマンスが改善するはずです.
-u
--unique
通常,比較結果が等しい行の最初の行のみを出力します. --check(-c)オプションに対し,比較結果が等しい連続し た行の対が無いことを調査します.
-k pos1[,pos2]
--key=pos1[,pos2]
pos1pos2(または,pos2が省略された場合は行末)の間か ら成り立つ,pos2含まれます,行の一部をソート時のフィー ルドに指定します.フィールドと文字の位置は,1から番号付けされます.そ のため,二番目のフィールドをソートするため,--key=2,2 (‘-k 2,2’)を使用してください.以下により多くの例があります.
-z
--zero-terminated
入力を行の集合として扱い,ASCII lf (Line Feed)の代わり にゼロバイト(ASCII nul (Null)文字)で終端します.このオ プションは,任意のパス名を(ラインフィード文字を含んでいても)確実に処理 するため,‘perl -0’や,‘find -print0’と‘xargs -0’と組み 合わせると便利です.

歴史的な(BSDとSystem Vの)sortの実装は,解釈が異なるオプショ ンがあり,特に,-b-f-nがあげられます. gnu sortは,POSIXの動作に従い,それは通常(常 にではない!)System Vの動作に似ています.POSIXによると, -nは,もはや-bを暗黙に指定しません.一貫性のため, -Mも同様に変更されました.これは,フィールドの指定が明確でな い状況で,文字の位置の意味に影響するかもしれません.唯一の訂正方法は, 明示的に-bを加えることです.

-kオプションを用いたソート時のフィールド指定の位置は, ‘f.c’形式となり,fは使用するフィールド数で, cはフィールドのはじまりから数えた最初の文字までの数です.最初の 位置として,‘.c’が省略されているとフィールドの最初の文字を 用います.-bオプションが指定されている場合,指定したフィール ドの‘.c’ の部分は,フィールドの最初の空白ではない文字から数 えます.

ソートキーの位置は,オプション文字‘Mbdfinr’を加えてもかまわず,そ の場合,大域的な順序オプションは,特定のフィールドに使用されません. -bオプションは,指定した最初と最後のフィールドの一方または両 方に独立に適用され,大域的なオプションを継承する場合,両方に適用されま す.キーは複数のフィールドに跨ってもかまいません.

古いシステムでは,sortは時代遅れのソートキーを指定するゼロを 起点とした構文の‘+pos1 [-pos2]’をサポートしています. POSIX 1003.1-2001 (see Standards conformance)ではこれを 許可していません.代わりに-kを使用してください.

様々なオプションの組合せを紹介する例は以下のようになります.


脚注

[1] POSIXではないロカール(例えばLC_ALLを ‘en_US’に設定している)場合,sortはいつもとは異なるソー トされた出力を生成する可能性があります.その状況では,LC_ALL環境 変数を‘C’に設定してください.LC_COLLATEだけを設定することに は二つの問題があることに注意してください.最初は,LC_ALLが既に設 定されている場合,無効になることです.二番目は,LC_CTYPE(または LC_CTYPEが設定されていない場合はLANG)が互換性の無い値に設 定されている場合の動作が未定義であることです.例えば,LC_CTYPEja_JP.PCKで,LC_COLLATEen_US.UTF-8の場合,動作は 未定義です.