ソート(Unix)

選別
原作者ケン・トンプソンAT&Tベル研究所
開発者さまざまなオープンソースおよび商用開発者
初回リリース1971年11月3日 (1971年11月3日
書かれたC
オペレーティング·システムMulticsUnixUnix ライクVPlan 9InfernoMSX-DOSIBM i
プラットフォームクロスプラットフォーム
タイプ指示
ライセンスcoreutils : GPLv3+プラン 9: MIT ライセンス

コンピューティングにおいて、sortはUnixおよびUnix系オペレーティングシステムの標準コマンドラインプログラムであり、入力行または引数リストにリストされたすべてのファイルの連結をソート順に出力します。ソートは、入力の各行から抽出された1つ以上のソートキーに基づいて行われます。デフォルトでは、入力全体がソートキーとして扱われます。デフォルトのフィールド区切り文字は空白です。このコマンドは、実装によって異なる可能性のあるいくつかのコマンドラインオプションをサポートしています。たとえば、" "フラグはソート順序を逆にします。ソート順序は環境のロケール設定の影響を受けます。[ 1 ]-r

歴史

sort汎用ソート機能を呼び出すコマンドは、Multics で初めて実装されました。[ 2 ]その後 Unixバージョン 1で登場しました。このバージョンは、AT&T ベル研究所ケン・トンプソンによって最初に作成されました。バージョン 4では、トンプソンはパイプを使用するように修正しましたが、sort は出力ファイルに名前を付けるオプションを保持していました。これは、ファイルの並べ替えに使用されていたためです。バージョン 5では、トンプソンは標準入力を表す "-" を発明しました。[ 3 ]

sortは、X/Open Portability Guide Issue 2(1987)の一部です。そこからPOSIXに継承されました。[ 4 ]

GNU coreutilsにバンドルされているsortのバージョンは、Mike HaertelとPaul Eggertによって作成されました。[ 1 ]この実装はマージソートアルゴリズムを採用しています。並列ソートのオプションも提供されていますが、8スレッドを超えるとパフォーマンスの向上は減少します。[ 5 ] GNU parallelは、同様のパフォーマンス向上特性を持つsortの並列呼び出しを実行するラッパーも提供しています。48コアシステムでは、速度向上は約3倍です。[ 6 ]

sortコマンドIBM iオペレーティングシステムにも移植されており、POSIX互換のQshellからアクセス可能となっている。[ 7 ]

非POSIXポート

同様のコマンドは他の多くのオペレーティングシステムでも利用可能であり、例えばソートコマンドはASCIIMSX-DOS2ツールMSX-DOSバージョン2用)の一部である。[ 8 ]

「uutils」プロジェクトは、 Rustsortで書かれたクロスプラットフォーム実装を提供し、GNU coreutilのすべてのオプションをサポートしています。RustのマルチスレッドライブラリであるRayonのor関数を使用し、 timsortに着想を得た適応型マージソート、またはパターンディフィート型クイックソートのバリエーションを実装しています。[ 9 ]par_sort_bypar_sort_unstable_by

構文

並べ替え [オプション]... [ファイル]... 

がない場合FILE、またはFILEの場合-、コマンドは標準入力から読み取ります。

パラメータ

以下の表で「Short」は、オプションの1文字形式(短縮形)のみをサポートしていることを示します。長いオプションは元々GNU拡張であり、SUSやPOSIXのどのバージョンにも含まれていません。その後、FreeBSDでも採用されました。

名前 説明 SUS / POSIXプラン9インフェルノフリーBSDリナックスMSX-DOSIBM i
-b , --先頭の空白を無視ro先頭の空白を無視します。 短い 短い いいえ はい はい いいえ 短い
-c--check入力ファイルがソートされていることを確認します。 いいえ 短い いいえ はい はい いいえ 短い
-C , --check=<サイレント|静か>-c と似ていますが、最初の不良行は報告されません。 いいえ いいえ いいえ はい はい いいえ いいえ
-d , --dictionary-order空白と英数字のみを考慮します。 短い 短い いいえ はい はい いいえ 短い
-f , --大文字と小文字を区別しない小文字を大文字に変換します。 短い 短い いいえ はい はい いいえ 短い
-g--general-numeric-sort--sort=general-numeric一般的な数値で比較します。 短い 短い いいえ はい はい いいえ いいえ
-h--human-numeric-sort--sort=human-numeric人間が判読できる数値を比較します (例: 2K 1G)。 短い いいえ いいえ はい はい いいえ いいえ
-i , --ignore-nonprinting印刷可能な文字のみを考慮します。 短い 短い いいえ はい はい いいえ 短い
-k , --key= POS1 [, POS2 ]キーをPOS1(起点1)から開始し、POS2(デフォルトの行末) で終了します。いいえ いいえ いいえ はい はい いいえ いいえ
-mマージのみ。入力ファイルは事前にソートされているものと想定されます。 いいえ 短い いいえ はい はい いいえ 短い
-M--month-sort--sort=month(不明) < 'JAN' < ... < 'DEC' を比較します。 短い 短い いいえ はい はい いいえ いいえ
-n--numeric-sort--sort=numeric文字列の数値に応じて比較します。 短い 短い 短い はい はい いいえ 短い
-o出力標準出力の代わりに OUTPUTファイルを使用します。いいえ 短い いいえ はい はい いいえ 短い
-r--reverse比較の結果を反転します。 短い 短い 短い はい はい いいえ 短い
-R--random-sort--sort=randomシャッフルしますが、同じキーをグループ化します。参照: shufいいえ いいえ いいえ はい はい いいえ いいえ
-s最後の手段の比較を無効にすることでソートを安定させます。 いいえ いいえ いいえ はい はい いいえ いいえ
-Sサイズ--buffer-size=サイズメモリ バッファの最大サイズには size を使用します。いいえ いいえ いいえ はい いいえ いいえ いいえ
-t文字--フィールドセパレータ=文字空白以外の文字から空白文字への遷移の代わりにcharを使用します。つまり、フィールドを区切る「タブ文字」はcharです。 いいえ 短い いいえ はい はい いいえ 短い
-T dir--temporary-directory= dir一時的にdirを使用します。 いいえ 短い いいえ はい はい いいえ いいえ
-u--ユニーク等しいキーを持つ行の各セットで 1 つを除くすべてを抑制するための一意の処理。 いいえ 短い いいえ はい はい いいえ 短い
-V , --version-sortテキスト内の(バージョン)番号の自然な並び替え いいえ いいえ いいえ はい はい いいえ いいえ
-w-i と似ていますが、タブとスペースのみを無視します。 いいえ はい いいえ いいえ いいえ いいえ いいえ
-z--zero-terminated改行ではなく0バイトで行を終了します いいえ いいえ いいえ はい はい いいえ いいえ
- ヘルプヘルプを表示して終了する いいえ いいえ いいえ はい はい いいえ いいえ
--バージョンバージョン情報を出力して終了する いいえ いいえ いいえ はい はい いいえ いいえ
/R比較の結果を反転します。 いいえ いいえ いいえ いいえ いいえ はい いいえ
/S各行の何桁を判断するかを決定する桁数を指定します。 いいえ いいえ いいえ いいえ いいえ はい いいえ
/AASCII コードで並べ替えます。 いいえ いいえ いいえ いいえ いいえ はい いいえ
/Hワイルドカードを使用する場合は、隠しファイルも含めます。 いいえ いいえ いいえ いいえ いいえ はい いいえ

ファイルをアルファベット順に並べ替える

$猫の電話帳 スミス、ブレット 555-4321ドウ、ジョン 555-1234ドウ、ジェーン 555-3214エイブリー、コリー 555-4132フォガティ、スージー 555-2314
$電話帳を 並べ替えAvery, Cory 555-4132 Doe, Jane 555-3214 Doe, John 555-1234 Fogarty, Suzie 555-2314 Smith, Brett 555-4321

番号で並べ替え

この-nオプションは、プログラムを数値でソートします。duコマンドは、ファイルサイズを表す数値で始まる出力を生成するため、その出力をsortコマンドにパイプすることで、ファイルサイズ(昇順)でソートされたファイルリストを作成できます。

$ du /bin/* |ソート-n 4 /bin/ドメイン名24 /bin/ls 102 /bin/sh 304 /bin/csh

lsオプションを指定したfindコマンドはファイル サイズを 7 番目のフィールドに出力します。そのため、ファイル サイズ順に並べられた LaTeXファイルのリストは次のように生成されます。

$ find . -name "*.tex" -ls | sort -k 7n 

列またはフィールド

特定の列で並べ替えるには、このオプションを使用します-k。例えば、-k 22列目で並べ替えるには「 」を使用します。以前のバージョンのsortでは、この+1オプションを使用すると、プログラムは2列目のデータ(+23列目など)で並べ替えていました。この使用法は非推奨です。

$郵便番号 アダム 12345ボブ 34567ジョー 56789サム 45678ウェンディ 23456
$ sort -k 2n郵便番号 アダム 12345ウェンディ 23456ボブ 34567サム 45678ジョー 56789

複数のフィールドで並べ替える

この-k m,nオプションを使用すると、複数のフィールドで構成される可能性のあるキー (列 で開始m、列 で終了n) で並べ替えることができます。

$猫の割り当て フレッド 2000ボブ 1000アン 1000チャド 1000ドン 1500エリック 500
$ソート-k2,2n -k1,1クォータ エリック 500アン 1000ボブ 1000チャド 1000ドン 1500フレッド 2000

ここでは、最初のソートは列2を使用して行われます。-k2,2nは、列2で始まり列2で終わるキーでソートし、数値順にソートすることを指定します。-k2の代わりに を使用すると、ソートキーは列2から始まり、行末まで拡張され、その間のすべてのフィールドを網羅します。 は、-k1,1列1の値を使用して同点を判定し、デフォルトでアルファベット順にソートすることを指示します。bobとchadは同じクォータを持ち、最終出力ではアルファベット順にソートされることに注意してください。

パイプ区切りファイルのソート

$ sort -k2,2,-k1,1 -t '|'郵便番号 アダム|12345ウェンディ|23456サム|45678ジョー|56789ボブ|34567

タブ区切りファイルの並べ替え

タブ区切りの値を持つファイルをソートするには、列区切りとしてタブ文字を指定する必要があります。この図では、シェルのドル引用符記法[ 10 ] [ 11 ]を使用して 、タブをCのエスケープシーケンスとして指定しています。

$ sort -k2,2 -t $'\t'電話帳Doe, John 555-1234 Fogarty, Suzie 555-2314 Doe, Jane 555-3214 Avery, Cory 555-4132 Smith, Brett 555-4321

逆順に並べ替える

この-rオプションは並べ替えの順序を逆にするだけです。

$ sort -rk 2n郵便番号 ジョー 56789サム 45678ボブ 34567ウェンディ 23456アダム 12345

ランダムに並べ替え

GNU実装にはハッシュに基づくオプションがありますが、これは完全なランダムシャッフルではありません。なぜなら、同一の行をまとめてソートしてしまうからです。真のランダムソートはUnixユーティリティshuf-R --random-sortによって提供されます。

バージョンで並べ替え

GNU実装には、-V --version-sortテキスト内の(バージョン)番号を自然な形でソートするオプションがあります。比較対象となる2つのテキスト文字列は、文字ブロックと数字ブロックに分割されます。文字ブロックは英数字順に比較され、数字ブロックは数値順に比較されます(つまり、先頭のゼロはスキップされ、桁数が多いほど大きい値となり、そうでない場合は左端の異なる桁で結果が決定されます)。ブロックは左から右に比較され、そのループ内で最初の等しくないブロックによって、どちらのテキストが大きいかが決定されます。これは、IPアドレス、Debianパッケージのバージョン文字列、および文字列に可変長の数値が埋め込まれている同様のタスクで機能します。

参照

参考文献

  1. ^ a bsort(1)  –  Linuxユーザーマニュアル– Manned.org のユーザーコマンド
  2. ^ 「Multics コマンド」 . www.multicians.org .
  3. ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. ベル研究所. 139.
  4. ^sort  – シェルおよびユーティリティリファレンス、 The Single UNIX 仕様、バージョン5、 The Open Group
  5. ^ 「ソート呼び出し(GNU Coreutils 9.8)」
  6. ^ 「NAME — GNU Parallel 20250922 ドキュメント」 . www.gnu.org .
  7. ^ IBM . 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020年9月5日閲覧。
  8. ^ 『MSX-DOS2 ツール ユーザーズマニュアル - MSX-DOS2 TOOLS ユーザーズマニュアル』 . 1993 年 4 月 1 日 – インターネット アーカイブ経由。
  9. ^ 「rayon::slice の ParallelSliceMut - Rust. docs.rs.
  10. ^ 「GNU Bashリファレンスマニュアル、Bashバージョン4.2用:セクション3.1.2.4 ANSI-C引用」。フリーソフトウェア財団、2010年12月28日。 2013年2月1日閲覧$'string'形式の単語は特別な扱いを受けます。この単語は文字列に展開され、バックスラッシュでエスケープされた文字はANSI C標準の規定に従って置換されます。
  11. ^ Fowler, Glenn S.; Korn, David G.; Vo, Kiem-Phong. 「KornShell FAQ」2013年5月27日時点のオリジナルよりアーカイブ2015年3月3日閲覧。$'...' 文字列リテラル構文は、スクリプト内で特殊文字を入力する際の問題を解決するためにksh93に追加されました。ANSI-C規則に従って、'...' と '...' の間の文字列を変換します。

さらに読む