ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
マニュアルページセクション 1: ユーザーコマンド Oracle Solaris 11 Information Library (日本語) |
- テキストファイルのソート、マージ、順序の確認
/usr/bin/sort [-bcdfimMnru] [-k keydef] [-o output] [-S kmem] [-t char] [-T directory] [- [ [kmem]] [- ] [+] [+pos1 [-pos2]] [file]...
/usr/xpg4/bin/sort [-bcdfimMnru] [-k keydef] [-o output] [-S kmem] [-t char] [-T directory] [-y [kmem]] [-z recsz] [+pos1 [-pos2]] [file]...
sort コマンドは、指定されたファイルのすべての行をソートし、その結果を標準出力に書き込みます。
比較は、各入力行から抽出された 1 つまたは複数のソートキーに基づいて行われます 。デフォルトでは、1 つのソートキー、つまり入力行全体が使用されます。また、ソートの順は、現在のロケールの照合順序に従います。
次にあげるオプションは、デフォルトの動作を変更します。
引数で指定された入力ファイルが、現在のロケールの 照合順序に従ってソートされていることを確認します。終了ステータスが設定されますが、正しくソートされていれば何も出力されません。
どんな場合でも何も出力されない、という点を除き /usr/bin/sort と同じです。
(旧式オプション) sort が最初に使用する主記憶量を指定するために使用されていました。このオプションは、仮想メモリーシステムには適していません。sort が使用するメモリー容量は、-S オプションで指定するようになりました。
(旧式オプション) システム固有の デフォルトバッファサイズを超えるような行が存在した場合でも、異常終了を起こさないようにするためのオプションでした。現在では、最長の行が書き込める大きさのバッファを sort が自動的に割り当てるので、このオプションは意味がなくなりました。
マージのみを行います。入力ファイルはソート済みであるものとします。
標準出力の代わりに使用される出力ファイル名を指定します。このファイルは入力ファイルの 1 つと同じでも構いません。
ソートを行うために使用するスワップメモリー容量の最大値を指定します (デフォルトの単位はキロバイト)。kmem には、バイト (b)、キロバイト (k)、メガバイト (m)、ギガバイト (g)、テラバイト (t)、の数値を直接指定したり、インストールされている物理メモリーに対する割合パーセント (%) で指定することができます。
directory 引数は、一時ファイルを入れるディレクトリ名です。
同一行を削除します。 同じキーを持つ行の組から 1 行のみを取り出し、他を抑制します。-c オプションと同時に指定すると、入力ファイルがソート済みであることと、同じキーを持つ複数の行が存在しないことの両方を確認します。
デフォルトのソートの並び換え順は、LC_COLLATE の値に依存します。LC_COLLATE が C に設定された場合、ASCII の並べ換え順でソートされます。LC_COLLATE が en_US に設定された場合、ある 2 つの文字列のうち、一方が他方よりも先に大文字を使用していて その他の点では一様である場合は 大文字/小文字を区別しますが、それ以外は大文字/小文字を区別しません。その他のロケールでは、別の並べ換え順でソートされます。
次にあげるオプションは、デフォルトの並べ換え規則を変更します。ソートキーフィールド指定とは無関係に並べ換えオプションがある場合、要求された並べ換え規則は、すべてのソートキーに適用されます。指定された並べ換えオプションが特定のソートキーに付いている場合 (「ソートキーオプション」の説明を参照)、このオプションはそのキーに対するすべてのグローバルな並べ換えオプションを無効にします。旧式のキーオプションでは、+pos1 オプションのあとに以下のオプションを 1 つ以上指定すると、その直前のオプションで指定されたキーフィールド に対してだけ有効になります。
辞書編集順にします。 比較では、英字、数字およびスペース (スペースおよびタブ) だけが有効です。
小文字と大文字の区別をしません。
非印字文字を無視します。
月名とみなして比較します。フィールドの先頭 3 文字 ( 空白文字以外 ) は 大文字に変換し、比較します。たとえば、英語ではソートの並び換え順は JAN < FEB < . . . < DEC です。月名でないフィールドは、"JAN" よりも低く見なされます。-M オプションは -b オプションの動作を含みます (下記を参照)。
ソートキーを、省略可能な空白文字、省略可能なマイナス符号、省略可能な小数点および桁区切り文字 (現在のロケールに定義されているもの) を持つ 0 個以上の数値からなる最初の数値列に限定します。キーの値は算術的な数値としてソートされます。空の数値列は、ゼロとみなされます。先行するゼロおよびゼロに付けられた符号は、並べ換えに 影響を与えません。
比較の意味を反転します。
フィールド区切り文字オプションの扱い方は、以下のオプションを使って 変更できます。
限定ソートキーの開始および終了位置の決定時に、先行する空白文字を無視します。最初のソートキーオプションの前に -b オプションが指定されている場合、このオプションはすべての ソートキーオプションに適用されます。それ以外の場合は、オプション引数の -k field_start、field_end、+pos1、-pos2 の各々に -b オプションを個別に指定します (下記を参照) 。
char をフィールド区切り文字として使用します。char は、(ソートキーに含まれることがあっても) フィールドの一部とは見なされません。char は、繰り返し出てきてもそれぞれが有効です (たとえば、<char><char> は空フィールドを区切ります) 。-t を指定しない場合、 デフォルトのフィールド区切り文字として空白文字が 用いられます。空白でない文字に続く、最大長の空白文字列が、フィールド区切り文字となります。
ソートキーは以下のオプションを使って指定できます。
keydef 引数は、限定されたソートキーフィールドの定義です。この定義の形式は次のとおりです。
-k field_start [type] [,field_end [type] ]
出力形式の説明
行の一部分に限定したキーフィールドを定義します。
文字群 bdfiMnr から得られる修飾子です。b 修飾子は -b オプションと同じ働きですが、対象とした field_start または field_end だけに適用されます。フィールド内の文字は、フィールド内の最初の空白でない文字から 数えられます。なお、これは first_character と last_character に個別に適用されます。その他の修飾子も、同じ文字で示すオプションと 同じ働きですが、対象としたキーフィールドにのみ適用されます。このように動作するのは、field_start または field_end のどちらか一方、あるいは両方が指定されているときです。field_start と field_end のいずれかに修飾子が付けられているとき、それらはオプションの対象とはなりません。
複数のキーフィールドがある場合、後にあるキーは、それ以前のキーが等しいと比較された場合にだけ 比較されます。-u オプションが指定された場合を除き、等しいと比較された行は、-d 、-f 、-i 、-n 、-k のいずれもが省略された場合と同じように並べ換えられます (-r オプションは、指定されていれば有効) 。また行の中の全バイトを用いて比較されます。
次の表記を見てください。
-k field_start[type][,field_end[type]]
これは field_start で始まり field_end で終わるキーフィールドを定義するものです。ただし field_start が行の限界を超えていたり、field_end のあとに位置している場合には、キーフィールドは空となります。field_end 指定を省略すると、行の終わりと見なされます。
フィールドは、区切り文字でない最長の文字列で、-t オプションが指定されていなければ先行するフィールド区切り文字も含みます。
keydef オプション引数の field_start 部分の形式は次のとおりです。
field_number[.first_character]
フィールド、およびフィールド内の文字には、1 から始まる番号が付けられます。field_number と first_character 指定は、いずれも正の 10 進整数と解釈され、ソートキーの部分として用いられる先頭の文字を指定します。.first_character 指定を省略すると、フィールドの先頭文字が使用されます。
keydef オプション引数の field_end 部分の形式は次のとおりです。
field_number[.last_character]
このうち field_number の意味は前述の field_start のものと同じです。last_character 指定は、負でない 10 進整数と解釈され、ソートキーの部分として用いられる 最後の文字を指定します。last_character の値の評価結果がゼロのとき、または .last_character 指定が省略されたときは、field_number が示すフィールドの最終文字が使用されます。
-b オプションまたは b 修飾子が有効なとき、フィールド中の文字はそのフィールドの 最初の空白でない文字から数えられます。なお、これは first_character と last_character に個別に適用されます。
(旧式オプション) -kkeydef オプションと同等な機能を提供します。
pos1 および pos2 はそれぞれ m.n という形式をとり、オプションでフラグ bdfiMnr の中から 1 つまたは複数のフラグを後に付けることができます。+m.n によって指定される開始位置は、m+1 番目のフィールドにある n+1 番目の文字であると解釈されます。.n がない場合は、m+1 番目のフィールドの先頭文字を指す .0 を意味します。b フラグが有効な場合、m+1 番目のフィールドの最初の空白文字以外の文字から n が数えられます。+m.0b は m+1 番目のフィールド内の最初の空白文字以外の文字を指します。
–m.n によって指定される最終位置は、m 番目のフィールドの最後の文字から後へ n 番目の文字 (区切り文字も含む) を意味するように解釈されます。.n がない場合、m 番目のフィールドの最後の文字を指す .0 を意味します。b フラグが有効な場合、m+1 番目のフィールドの前についている最後の空白文字から n が数えられます。したがって、–m.1b は、m+1 番目のフィールド内の最初の空白文字以外の文字を指します。
次の記述は、+pos1 -pos2 の形式をタイプ修飾子 T と U とともに指定したものです。
+w.xT -y.zU
次と同等です。
undefined (z==0 & U contains b & -t is present) -k w+1.x+1T,y.0U (z==0 otherwise) -k w+1.x+1T,y+1.zU (z > 0)
ソートキー (-k オプションおよび旧式の +pos1 と -pos2) は少なくとも 9 個記述できます。複数個ある場合、コマンド行での順序が意味を持ちます。ソートキーを 1 つも指定しないと、行全体のデフォルトのソートキーが使用されます。
次のオペランドがサポートされています。
ソート、マージ、または確認するファイルのパス名。file オペランドを 1 つも指定しない場合、または file オペランドに - を指定した場合には、標準入力が用いられます。
ファイルが 2G バイト (231 バイト) 以上ある場合の sort の動作については、largefile(5) を参照してください。
以下の例では、sort キーを指定する方法のうち旧式のものと旧式でないものの両方を示します。これにより両形式の関係が理解しやすくなるはずです。
例 1 第 2 フィールドをソートキーとしてソートする
第 2 フィールドをソートキーとして用いて、infile の内容をソートします。
example% sort -k 2,2 infile example% sort +1 -2 infile
例 2 逆の順序でソートする
第 2 フィールドの 2 番目の文字をソートキーとして、infile1 および infile2 の内容を逆の順序でソートし、outfile に出力します。なお第 2 フィールドの先頭文字はフィールド区切り文字であると想定しています。
example% sort -r -o outfile -k 2.2,2.2 infile1 infile2 example% sort -r -o outfile +1.1 -1.2 infile1 infile2
例 3 ファイル中の特定の 1 文字をキーとしてソートする
第 2 フィールドの 2 番目の空白でない文字をソートキーとして、infile1 と infile2 の内容をソートします。
example% sort -k 2.2b,2.2b infile1 infile2 example% sort +1.1b -1.2b infile1 infile2
例 4 ユーザー ID でソートする
ユーザー ID (コロンで区切った 3 番目のフィールド) でソートされたパスワードファイル passwd(4) を出力します。
example% sort -t : -k 3,3n /etc/passwd example% sort -t : +2 -3n /etc/passwd
例 5 フィールドが重複する行を除外してソートされた行を出力する
ソート済みファイル infile の行の出力において、同じ第 3 フィールドを持つ行のうち、最初に現われる行だけを出力します。
example% sort -um -k 3.1,3.0 infile example% sort -um +2.0 -3.0 infile
例 6 ホスト IP アドレスでソートする
次のコマンドは、どちらも数値形式の IP アドレス (先頭から 4 番目までの数値フィールド) でソートされた hosts(4) ファイル (IPv4 ホストデータベース) を出力します。
example$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n /etc/hosts example$ sort -t . +0 -1n +1 -2n +2 -3n +3 -4n /etc/hosts
'.' は、フィールドの区切り文字であると同時に、多くのロケールで 10 進数の区切り文字として使用されています。そのため、フィールドの末尾の指定に失敗すると、2 つめのフィールドが 1 つめのフィールドの小数部として認識されてしまうといった問題が発生します。
sort の実行に影響を与える次の環境変数については、environ(5) を参照してください。LANG、LC_ALL、LC_COLLATE、LC_MESSAGES、および NLSPATH。
テキストデータのバイト列を文字 (たとえば、引数や入力ファイル中のシングルバイト文字や複数バイト文字) として解釈するロケールや、-b 、-d 、-f 、-i 、-n の各オプション用に、文字分類の方法を指定する ロケールを定義します。
-n オプション用に、小数点や桁区切り文字を指定するロケールを定義します。
次の終了値が返されます。
入力ファイルはすべて正常に出力された、または -c が指定され入力ファイルは正しくソートされていた。
-c オプションが指定され入力ファイルは指定どおりにソートされていなかった、または -c と -u の両オプションが指定され 2 つの入力行のキーが等しかった。
エラーが発生しました。
一時ファイル
属性についての詳細は、attributes(5) を参照してください。
|
|
comm(1), join(1), uniq(1), nl_langinfo(3C), strftime(3C), hosts(4), passwd(4), attributes(5), environ(5), largefile(5), standards(5)
さまざまなトラブル (たとえば、入力行が長すぎる) が発生した場合や -c オプションにおいてソート済みでないことを発見した場合、コメントを出力し、0 以外の終了ステータスで終了します。
入力ファイルの最終行に復帰改行文字 (NEWLINE) がない場合、sort はこれを追加し、警告メッセージを出力し、処理を継続します。
sort で、等しいキーを持つ行の相対的な順序が保存されるという保証はありません。
-S オプションを使用して、特定の用途に sort の動作を調整することができます。ただし、sort は仮想メモリーシステムよりも、ソート時により適切に膨大な量のメモリーを利用できることに注意してください。このため、-S を使用して、膨大なメモリーを利用するようにしてソートを実行すると、パフォーマンスがかなり低くなることもあります。
前述のように、フィールド修飾子の一部 (-M や -d など) は、入力データをロケール固有の設定と照合して解釈します。ロケール固有の設定を考慮に入れていないと、解釈の結果が予期しないものになることがあります。たとえば月の名前をキーにする場合、一般に通用する省略名を使用しても、sort コマンドはそれを正しい名前に読み換えることはしません。sort コマンドが認識する省略名は、nl_langinfo(3C) または strftime(3C) で定義されているものだけです。表示可能順や辞書編集順でソートする場合、このような定義がロケールで適切に設定されていないと、空のソートキーが返されることがあります。結果として、次のキーが適切な並べ替えを決定する有効なキーになります。