sortコマンド(テキストファイルをソートする)
形式
sort[-c|-m][-b][-f][-n][-r][-u][-z] [-k 開始位置[,終了位置]][-o 出力先パス名] [-T 一時ファイルディレクトリ][-t フィールド区切り文字] [入力パス名 ...]
機能
ファイルや標準入力から入力して,次のどれかの処理を実施します。実行結果を標準出力に出力します。
-
ソート
-
マージ
-
ソートされているかのチェック
引数
- 動作モードの指定
-
動作モードの指定をするオプションを省略すると,ソートします。ソートを昇順にするか降順にするかは,-rオプションの有無で指定します。
- -c
-
指定したファイルに対してソートされているかどうかチェックします。チェック機能は,1つのファイルが正しくソートされているかどうかを判定します。
ソートされている場合は終了コード0で終了します。ソートされていない場合は,標準エラー出力にメッセージ(sort: found disorder: フィールドの内容)を出力し,終了コード1で終了します。
このオプションを指定した場合,入力ファイルを2個以上指定するとエラーとなります(sort: too many input files for the -c option)。-uオプション以外のオプションと同時に指定した場合,このオプションを最優先します。複数回指定してもエラーになりません。
-cオプションを指定しない場合はソートします。
- -m
-
入力ファイルはソートされていると仮定してマージだけします。-cオプションが同時に指定されている場合,-mオプションは無視されます。複数回指定してもエラーになりません。
-mオプションを指定しない場合はソートします。
- 入出力の指定
-
- -o 出力先パス名
-
標準出力の代わりに出力先パス名に指定したファイルに出力します。
出力先のファイルが存在しない場合は新規に作成します。UNIXの場合,新規に作成したファイルのパーミッションはumaskに従って設定します。
ファイルが存在する場合は中間ファイルにいったん出力してから,元のファイルを削除して中間ファイルを出力ファイル名に変更します。この中間ファイルの出力先は入力ファイルと同一ディレクトリに作成します。UNIXの場合,ファイルのパーミッションはumaskに従って新たに設定します。
このオプションを複数指定した場合,最後に指定したオプションが有効になります。
UNIXの場合,出力先パス名に/dev/stdout(Windowsの場合も小文字で/dev/stdoutと記述する)を指定したとき,標準出力を使用します。
出力先パス名にシンボリックリンクを指定した場合,リンクを削除し,新規のファイルが作成されます。
- -T 一時ファイルディレクトリ
-
sortコマンドで内部処理として使用する一時ファイルを作成するディレクトリとして,一時ファイルディレクトリで指定したディレクトリを使用します。
一時ファイルとは,ソートおよびマージ処理でメモリ上だけで処理ができない場合に使用する作業用のファイルのことです。
このオプションを複数指定した場合,最後の指定が有効になります。
このオプションを省略した場合,次のディレクトリを使用します。
Windowsの場合,共通アプリケーションフォルダ\HITACHI\JP1AS\miscを使用します。
UNIXの場合,環境変数TMPDIRに定義されたディレクトリを使用します。環境変数TMPDIRが定義されていないときは,/var/tmpを使用します。
- 入力パス名
-
入力するファイルを指定します。入力パス名に指定がない,または入力パス名として「-」を指定した場合は,標準入力から入力します。/dev/stdin(Windowsの場合も小文字で/dev/stdinと記述する)を指定した場合,標準入力を使用します。
- ソートキーに対する指定
-
- -b
-
-kオプションで指定した開始位置および終了位置に対して,行頭のスペースを無視してソートキーの位置を決めます。-kオプションでソートキーを指定した場合に,-bオプションは有効です。-bオプションは-kオプションよりあとに記述できません。
- -f
-
小文字を大文字と見なしてソートします。複数回指定してもエラーになりません。
- -n
-
先頭の数値文字列を数値としてソートします。
-fオプションよりも-nオプションが優先されます。このオプションは複数回指定できます。
数値の扱いを次に示します。
-
アスキー文字の0(0x30)〜9(0x39)で構成される文字列です。
-
先頭のスペース(0x20および0x09)ならびにゼロ(0x30)は無視します。
-
数値にマイナス記号(0x2d)を前に置いてもかまいません。
-
数値の小数点は1つまで指定できます。
-
数値に,整数部分の桁区切り文字を含んでもかまいません。
-
小数点および整数部分の桁区切り文字はロケールによって異なります。主に小数点はピリオド(.),整数部分の桁区切り文字はコンマ(,)に定義されています。
-
数値文字列がない場合は0として扱います。
-
整数の桁数,または小数点以下の値で小数点以下の桁数が61以上になる数値をソートキーとして指定しないでください。
-
- -r
-
-rオプションを指定すると降順に出力します。このオプションを指定しない場合,昇順に出力します。このオプションは複数回指定できます。
- フィールド区切りの指定
-
- -t フィールド区切り文字
-
フィールド区切り文字を指定します。ソートキーのオフセットを決める場合,フィールド区切り文字はフィールドの一部と見なされません。また,連続するフィールド区切り文字は空のフィールドとなります。レコードの区切り文字と同じ文字は指定できません。
-tオプションを指定していない場合,デフォルトのフィールド区切りは連続したスペースとなり,スペースと非スペースの間でフィールドを区切ります。連続したスペースが空のフィールドを区切ることはありません。先頭のスペースは,ソートキーのオフセットを決めるときにフィールドの一部と見なされます。
フィールド区切りとして複数文字指定した場合,およびマルチバイト文字を指定した場合は,先頭1バイトをフィールド区切りと見なします。レコード区切りと同じバイト値を指定できません。
-tオプションにフィールド区切り文字の指定をしなかった場合,直後に指定したオプションおよびファイル名がフィールド区切り文字として処理されます。そのため,区切り文字を指定するようにしてください。このオプションは複数指定するとエラーとなります(sort: multiple field delimiters)。
- ソートキーの指定
-
- -k 開始位置[,終了位置]
-
ソートキーの開始位置および終了位置を指定します。複数指定すると,最初のソートキーが等しい場合に次のソートキーで比較できます。
開始位置より終了位置の指定が大きい場合または指定したフィールドが存在しない場合,ソートキーの指定はないものとして扱われ,このソートキーの比較は等しいと判断されます。
開始位置および終了位置は,次の形式で指定します。
フィールド位置[.インデント][bfnr]
-
フィールド位置
レコード内のフィールドの位置を指定します。数値以外を指定するとエラーとなります(sort: missing field number)。負の値を指定するとエラーとなります(sort: field numbers must be positive)。
開始位置には0を指定できません。
終了位置に0を指定した場合,レコードの末尾までを仮定します。
フィールド位置にはint型の最大値まで指定できます。それ以上を指定すると,オーバーフローが発生して予測しない値になることがあるため,指定しないでください。
フィールド位置の終了位置に0を指定した場合,次のインデントで説明する終了位置の指定はできません。
-
インデント
フィールドの中のオフセットを指定します。数値以外または負の値を指定するとエラーとなります(sort: missing offset)。
インデントの単位はバイトで,マルチバイトの途中を指定するとそのバイト位置から評価します。
開始位置のインデントには0を指定できません。
終了位置のインデントには0を指定できますが,0を指定するとインデントの指定がないと見なされます。
インデントはint型の最大値まで指定できます。それ以上を指定すると,オーバーフローが発生して予測しない値になることがあるため,指定しないでください。
フィールド位置の開始位置でインデントを省略した場合,フィールドの先頭バイト位置となります。
フィールド位置の終了位置でインデントを省略した場合,フィールドの最終バイト位置となります。
-
ソートキーに指定するオプション
ソートキーは,bオプション,fオプション,nオプション,rオプションで指定できます。
bオプションでは,前のスペースを無視してソートキーの位置を決めます。
fオプションでは,小文字を大文字と見なしてソートします。
nオプションでは,先頭の数値文字列を数値としてソートします。
rオプションでは,降順にソートします。
開始位置に指定したbオプションは開始位置にだけ有効です。また,終了位置に指定したbオプションは終了位置にだけ有効です。終了位置にインデントの指定がない場合は,bオプションは無効になります。-bオプション以外のオプションは,開始位置または終了位置のどちらにも指定でき,意味は同じです。
-
- その他の指定
ソート機能
ソート機能は,1つまたは複数のファイルを読み込み,1つまたは複数のソートキーを比較します。ソートキーは,-kオプションで指定し,1つまたは複数のフィールドで指定します。フィールドは,-tオプションで指定するフィールド区切り文字でレコードを区切ります。
ソートキーの指定がない場合,デフォルトではレコード全体を1つのソートキーと見なします。ソートキー同士はバイトごとに比較します。
ソートキーが複数ある場合,先頭に指定したソートキーを比較し,一致したときは次のソートキーを不一致になるまで順次比較します。
ソートキーがすべて一致した場合,レコード全体をバイト単位で比較して出力します。-rオプションの指定がない場合は昇順に,-rオプションの指定がある場合は降順に出力します。
- ソートキーに対するオプションの指定方法
-
ソートキーに対するオプションは2つに分類されます。1つまたは複数のキーを指定した場合にそれぞれに有効となるグローバルオプションと,-kオプションに指定するローカルオプションです。
sortコマンドで指定する-fnrbオプションはグローバルオプションです。また,sortコマンドの-kオプションに指定するfnbrをローカルオプションと呼びます。グローバルオプションは-kオプションより後ろに指定できません。
各オプションをグローバルオプションとローカルオプションで指定した場合の動作を次に示します。
オプション
動作
b
グローバルオプションの指定は,-kオプションに指定する開始位置および終了位置の両方に有効になります。終了位置にインデント指定がない場合,または終了位置のインデントに0を指定した場合は,終了位置に対する指定は無効となります。
-kオプションを指定しない場合は,-bオプションの指定は無効となります。
f|n|r
ローカルオプションに指定がある場合,グローバルオプションの指定を無視します。
グローバルオプションの指定例を次に示します。
-bfnr -k 1,1 -k 2,2
1番目と2番目のフィールドは-bfnrオプションが有効になります。1番目と2番目のフィールドに次のように指定します。
-
-bオプション:前のスペースを無視してソートキーの位置を決めます。
-
-fオプション:小文字を大文字と見なして比較します。-nオプションの指定によって無効となります。
-
-nオプション:先頭の数値文字列を数値として比較します。
-
-rオプション:降順となるように比較します。
グローバルオプション-bの指定がない場合のソートキーの範囲を次に説明します。
- -k 1
-
1番目のフィールドからレコードの末尾までをソートキーとします。
- -k 1,1
-
1番目のフィールド全体をソートキーとします。
- -k 1,5
-
1番目のフィールドの先頭バイトから,5番目のフィールドの最終バイトをソートキーとします。
- -k 1.2,5.11
-
1番目のフィールドの2バイト目から5番目のフィールドの11バイト目までをソートキーとします。
- -k 2,1
-
2番目から1番目のフィールドの指定ですが,大小関係が逆転しており,ソートキーは比較されません。
- -k 2.1b,5.1b
-
2番目のフィールドの先頭のスペースを除いた1バイト目から,5番目のフィールドの先頭スペース文字を除いた1バイト目までをソートキーとします。
- -k 2.1b,5.0b
-
2番目のフィールドの先頭のスペースを除いた1バイト目から,5番目のフィールドの最終バイトまでをソートキーとします。
-
マージ機能
マージ機能はソート済みの各入力ファイル間のレコードを比較してデータを整列し,結合します。実際にはソートされていない場合でも,ソートしたと仮定して動作します。file1およびfile2をマージする例を次に示します。
- file1
AAA DDD
- file2
BBB AAA
- file1およびfile2をマージするコマンド
# sort -m file1 file2
この場合,次のように結合します。
AAA (file1の1行目のレコード) ←file1:1行目とfile2の1行目を比較した結果 BBB (file2の1行目のレコード) ←file1:2行目とfile2の1行目を比較した結果 AAA (file2の2行目のレコード) ←file1:2行目とfile2の2行目を比較した結果 DDD (file1の2行目のレコード) ←file2:3行目がないためfile1の2行目
小文字を大文字と見なすオプション(-fオプション)
レコードをソートする場合の例を次に示します。
- file1
a:B A:b
- 大文字と見なさないソートコマンド
$ sort -t : -k 2,2 file1
「:」で区切った2つ目のフィールドをキーにソートします。
- 大文字と見なさないソートコマンドの出力
a:B A:b
bよりBが小さいため,「a:B」が先に出力されます。
- 大文字と見なすソートコマンド
$ sort -f -t : -k 2,2 file1
-fオプションを追加します。
- 大文字と見なすソートコマンドの出力
A:b a:B
2つ目のフィールドを-fオプションの指定に従って大文字と見なして比較するため,同じ値のソートキーと評価します。ソートキーが同じ値であるため,レコード全体をバイトで比較します。この結果,aよりAが小さいため「A:b」が先に出力されます。
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了 |
1 |
正常終了
|
2 |
エラー終了 |
注意事項
-
メモリ上で処理ができない場合,一時ファイルを使用して処理をします。一時ファイルの使用時にディスク容量が不足した場合,次のメッセージを出力してエラーになります。
sort: fwrite: No space left on device
上記のメッセージが出力された場合は,-Tオプションを使用して,容量に十分な空きがあるディスクを指定してください。
-
sortコマンドの実行を中断すると,-oオプションで指定したファイルが存在するディレクトリに中間ファイルが残ることがあります。この場合は手動で削除してください。-oオプションを指定しない場合も一時ファイルを使用すると,実行中断などで一時ファイルが残ることがあるため,手動で削除してください。
-
sortコマンドでのスペースとは,\t(タブ)とスペース文字(0x20)のことです。また,-zオプションを指定すると\n(改行)もスペースと見なされます。
-
入力ファイルの最終レコードにレコード区切り文字がなくても,ソートおよびマージの結果にはレコード区切り文字が付加されます。
-
入力の改行コードは<CR><LF>または<LF>で処理できますが,UNIXの場合,<CR>はデータとして扱います。また,出力結果は入力ファイルの改行コードの形式に関係なく,プラットフォームの改行コードに従った改行コードになります。
-
レコードが格納できない場合,格納できるまで拡張します。メモリが確保できない場合,エラーとなります。
-
ソートで使用するバッファは16MBです。このバッファでソートを継続できない場合,一時ファイルを作成します。そのため,大容量データではこのコマンドを使用しないことを推奨します。
-
ソート・マージ処理でメモリ上だけで処理ができない場合,sortコマンドの処理を中断すると,次の名前の一時ファイルが残ることがあります。この場合は手動で一時ファイルを削除してください。
- 【Windowsの場合】
-
soruuuu.tmp(uuuuは任意の16進文字列)
- 【UNIXの場合】
-
sortppppp.XXXXXX(pppppは5桁以上のプロセスID,XXXXXXは任意の6文字の文字列)
-
-oオプションを指定した場合,sortコマンドの処理を中断すると,次のファイル名の中間ファイルが残ることがあります。この場合は手動で中間ファイルを削除してください。
- 【Windowsの場合】
-
出力先パス名の先頭3文字uuuu.tmp(uuuuは任意の16進文字列)
- 【UNIXの場合】
-
出力先ファイル名pppppXXXXXX(pppppは5桁以上のプロセスID,XXXXXXは任意の6文字の文字列)
-
-oオプションに同じ出力先パス名を指定して多重実行すると,エラー終了することがあります。この場合の動作は保証できません。
使用例
sortコマンドを実行した結果表示に使用するファイルの形式を次に示します。
-
file1
yyyy:101 tttt:8 ppppppp:14
-
file2
cccccc:101 ggggg:31 rrrrrrrr:5 mmmmmmm:14
コマンドの実行例を次に示します。
-
2つのテキストファイルを合わせて並べ替えます。
$ sort file1 file2 cccccc:101 ggggg:31 mmmmmmm:14 ppppppp:14 rrrrrrrr:5 tttt:8 yyyy:101
-
2つのテキストファイルを合わせて,数値部分の降順で並べ替えます。
$ sort -t: -n -r -k 2 file1 file2 yyyy:101 cccccc:101 ggggg:31 ppppppp:14 mmmmmmm:14 tttt:8 rrrrrrrr:5
-
1番目のフィールドをソートキーとして,3つのファイルをマージします。
$ cat s1.txt AAA s1 DDD s1 $ cat s2.txt BBB s2 AAA s2 $ cat s3.txt CCC s3 111 s3 $ sort -m -k 1,1 s1.txt s2.txt s3.txt AAA s1 BBB s2 AAA s2 CCC s3 111 s3 DDD s1 $
-
キーが同じデータをソートします。
$ cat zr1.txt aaa:999 $ cat zr2.txt bbb:999 $ sort -k 2,2 -t : zr2.txt zr1.txt aaa:999 bbb:999 $
-
1番目のフィールドは数値として,2番目のフィールドは文字列としてソートします。
入力コマンド
sort -t : -k 1n,1 -k 2,2
入力データ
0010:aaa 10:AAA -1:aaa -1.00:ZZZ 1:zzz
実行結果
-1.00:ZZZ -1:aaa 1:zzz 10:AAA 0010:aaa
-
3番目のフィールドの先頭から行末までの小文字を大文字として評価し,2番目のフィールドは降順に評価してソートします。2番目のフィールドにはローカルオプションを指定しているため,グローバルオプションの指定は有効ではなく,小文字は小文字として評価します。
入力コマンド
sort -t : -f -k 3 -k 2,2r
入力データ
aaa:aaa:cccc aaa:AAA:cccc aaa:aaa:AAAA aaa:AAA:aaaa aaa:aaa:BBBB aaa:AAA:bbbb
実行結果
aaa:aaa:AAAA aaa:AAA:aaaa aaa:aaa:BBBB aaa:AAA:bbbb aaa:aaa:cccc aaa:AAA:cccc
-
オプションエラーのメッセージを表示します。
Windowsの例
C:\TEMP>%ADSH_OSCMD_DIR%\sort -w sort: illegal option -- w usage: sort [-cm][-bfnruz] [-k field1[,field2]] [-o output] [-T dir] [-t char] [file ...]
Linuxの例
$ sort -w sort: invalid option -- w usage: sort [-cm][-bfnruz] [-k field1[,field2]] [-o output] [-T dir] [-t char] [file ...]
AIXの例
$ sort -w sort: illegal option -- w usage: sort [-cm][-bfnruz] [-k field1[,field2]] [-o output] [-T dir] [-t char] [file ...]
-
入力ファイルにディレクトリを指定した場合のメッセージを表示します。
$ ./sort dir01 sort: dir01: Is a directory
-
入力ファイルとして存在しないファイルを指定した場合のメッセージを表示します。
$ ./sort xxxx sort: xxxx: No such file or directory
-
存在しない一時ファイルディレクトリを指定した場合のメッセージを表示します。
Windowsの例
C:\TEMP>%ADSH_OSCMD_DIR%\sort -mTxxx s0.txt s0.txt s0.txt s0.txt s0.txt s0.t xt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt sort: xxx\sort: The directory name is invalid.
Linuxの例
$ ./sort -mT xxxx s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt sort: xxxx/sort.SDm1yr: No such file or directory
AIXの例
$ ./sort -mT xxxx s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt s0.txt sort: xxxx/sort.XXXXXX: No such file or directory
-
不当なフィールド位置を指定した場合のメッセージを表示します。
C:\TEMP>%ADSH_OSCMD_DIR%\sort -k xx sort: missing field number
-
不当なフィールド位置を指定した場合のメッセージを表示します。
C:\TEMP>%ADSH_OSCMD_DIR%\sort -k 0 s0.txt sort: field numbers must be positive
-
不当なインデントをフィールド位置に指定した場合のメッセージを表示します。
C:\TEMP>%ADSH_OSCMD_DIR%\sort -k 1.0 s0.txt sort: illegal offset