0
Words
0
Characters
0
No spaces
0
Lines
0
Paragraphs
0
Sentences
0 min
Reading time
Lines to sort
Sorted output

行をソート: テキストをアルファベット順にオンラインで並べ替え

リストを貼り付け、順序を選び、ソート結果を取得します。大文字小文字の区別あり/なし、昇順/降順、ファイル名やバージョン文字列向けの natural sort 付き。

行ソートツールとは

テキストブロックを受け取り、改行で分割し、行を並べ替えて結果を返す、ブラウザ内で動く無料ツールです。サインアップ不要、アップロード不要、何もマシンの外には出ません。貼り付け、クリック、コピー、それだけです。

コマンドラインで sort を実行するのと同等ですが、LC_COLLATE と格闘する必要も、macOS が古い BSD sort を同梱している事実に悩まされる必要も、Windows には Git Bash を入れない限り sort 自体が無いという事実に振り回される必要もありません。3 つのチェックボックスで実用上必要なケースをカバーします: 昇順か降順か、大文字小文字を区別するかしないか、そして file2file10 より前に来るような natural sort です。

依存関係のリストを package.json に貼り付けたら次の install で npm が並べ替えていた、という経験があるなら、このツールは npm 7+ がやっていることを再現するので、CI が走ったときに diff が空になります。

sort の実際の動き

内部ではブラウザの Intl.Collator API を使っています。これにより、Unicode Collation Algorithm (UTS #10) が定める Unicode を理解する比較関数が手に入り、生の codepoint 比較ではありません。実用的な違いとしては、Intl.Collatorée の隣にソートされること、ドイツ語の ß が一次レベルで ss と同等に比較されること、大文字と小文字は三次レベルでしか違わないことを知っています。

lexicographic な sort とロケールを意識した sort は別物です。純粋な codepoint sort(LC_ALL=C sort がやる動作)では、A が U+0041、a が U+0061 なので、すべての大文字がすべての小文字より前に来ます。Unicode のデフォルト collation による sort はそれらを交互に並べます: A < a < B < b < C。Excel や Google Sheets の Sort A-Z を押したときに人々が期待する順序に合うので、デフォルトはロケール対応の順序にしています。codepoint スタイルの順序に戻したい場合は、大文字小文字を区別するチェックボックスをオンにします。

natural sort が 3 つ目の軸です。これを有効にすると、埋め込まれた数値が文字単位ではなく数値として比較されるので、file2.logfile10.log より前に来ます。背景を知りたければ、Wikipedia に 自然順序 についてのきれいな説明があります。実装は Intl.Collatornumeric: true オプションを使っており、これは Finder、Windows Explorer、最近の GNU sort -V が使うのと同じプリミティブです。

3 ステップで行をソートする方法

入力ペイン 1 つ、出力ペイン 1 つ。すべてローカルで動きます。タブを閉じればテキストは消えます。

  1. 1

    行を貼り付け

    リストをエディタに貼り付け、1 行に 1 項目です。末尾の空行は問題ありません。CRLF と LF どちらの改行も動きます。指定がなければ出力は LF に正規化されます。3 つのオプションすべての動きを先に見たいときは、Sample ボタンで小さな混在リストをエディタに入れられます。

  2. 2

    sort オプションを選択

    昇順降順 を選び、Applebanana より前に置きたい場合は 大文字小文字を区別 を切り替え、ファイル名やバージョンが混ざるときは Natural sort をオンにします。空行を削除 はソートする前に空の行を捨てます。重複を削除 は同じ行をひとつにまとめます。

  3. 3

    ソート結果をコピー

    Sort を押します。結果は出力ペインに表示されます。Copy でクリップボードへ、Download.txt ファイルとして保存できます。ヘッダーの行数カウンタは結果の行数を表示するので、重複削除をオンにしていてどれくらいの重複が消えたかを知りたいときに便利です。

行のソートが正解になる場面

キャンペーン送信前のメールリストのソート

マーケがサブスクライバーのメールの CSV をキャンペーンツールに貼り付けますが、リストは登録順で来ます。実用上メールのローカル部分は大文字小文字を区別しないので、まずここで大文字小文字を区別しない設定にしてアルファベット順にソートし、それからデデュープします。キャンペーンツールへのインポートが速くなり、gmial.com のようなタイポしたドメインも、正しい gmail.com ブロックの隣に並ぶのですぐ見つかります。

CSS クラス名や HTML 属性順のアルファベット化

PR の diff をきれいに保つために、class="..." 属性のクラス名をアルファベット順にする運用をしているチームもあります。値を貼り付け、ソートし、貼り戻すだけです。同じ手は、リンタが文句を言うときの HTML 属性順や、リポジトリに prettier-plugin-tailwindcss が入っていないときの Tailwind ユーティリティクラスの手動ソートにも使えます。

将来の PR の diff をきれいにするための .gitignore のソート

誰もが追記する .gitignore は、いつのまにかガラクタ箱になります。一度アルファベット順にソートしてコミットすれば、以降は追加が自然な位置に入り、レビュアーにとっても diff が筋の通ったものになります。同じ話は .dockerignore.eslintignore、それから tsconfig.jsonfiles 配列をチームが運用している場合にも当てはまります。

チャットから貼り付けた TODO リストの整頓

Slack や Discord は、変な順序で、半端に空いた行と、同じことを 2 度言った人の重複を含むリストを貼ってきます。貼り付け、Remove blank lines と Remove duplicates をオンにし、ソート。タスク管理ツールに突っ込むためのきれいな順序付きリストが手に入ります。

国コード、空港コード、通貨コードのリストのソート

ISO 3166 国コード、IATA 空港コード、ISO 4217 通貨コード。これらはすべてソートしておくと得をするルックアップファイルに住みます。コードは固定長なので natural sort は不要ですが、一部のソースは USDusd を混ぜてくるので、大文字小文字の非区別は重要です。ソート、デデュープ、ルックアップテーブルへ貼り戻し。

package.json の依存リストのソート

package.json の依存キーは npm 7+ が install のたびにアルファベット化しますが、まだ npm 6(または yarn 1)で固定しているプロジェクトを編集している場合、順序は自動では変わりません。依存キーを貼り付け、A-Z でソートし、貼り戻します。次の PR には、本来の変更の上に 200 行の並べ替えコミットが乗らずに済みます。

行ソート クイックリファレンス

このツールが公開する sort オプションと、それがカバーするエッジケースの短いチートシートです。

TopicWhat this tool does
lexicographic vs collationlexicographic(codepoint)sort は生の Unicode 値で並べます: A (U+0041) が a (U+0061) より前。collation sort は Unicode Collation Algorithm に従い、大文字と小文字を交互に並べます。このツールはデフォルトで collation を使います。codepoint 順にしたいときは Case-sensitive をオンにしてください。
大文字小文字の区別デフォルトは非区別: appleAppleAPPLE は等しく比較されます。Case-sensitive に切り替えると、collation 三次レベルでの A < a < B < b の順、または C ロケールと組み合わせれば生の codepoint 順になります。
natural sortオンのとき、file2 < file10210 が数値として比較されるからです。オフのとき、file10 < file21 (U+0031) が 2 (U+0032) より文字単位で小さく比較されるからです。ファイル名、バージョン文字列、その他数値が埋め込まれたリストに使ってください。
ロケールへの対応sort はページのロケールに従います。フランス語では ée の隣に並び、ドイツ語の ä は DIN 5007-2 の電話帳順では ae として並ぶ、などです。unix の sort コマンドも LC_COLLATE が設定されていれば同じことをします。LC_ALL=C sort は codepoint 順に戻り、速いですが、アクセント記号は外来文字として扱われます。
空行の扱い昇順では空行は空でないどの行よりも前にソートされるので、先頭に集まります。完全に取り除くには Remove blank lines をオンにしてください。入力末尾の改行はそのまま保持され、出力が cat などのツールを通っても往復で崩れないようになっています。
安定性sort は安定です: あなたの設定の下で等しく比較される行は、元の相対順序を保ちます。これは接頭辞でソートしたり、case-insensitive モードで等しい組の中で入力順を保ちたいときに効きます。V8(Chrome、Edge、Node)も SpiderMonkey(Firefox)も 2019 年以降 Array.prototype.sort の安定性を保証しています。
改行(LF vs CRLF)入力は \r\n\n\r で分割されます。出力はデフォルトで \n で結合されるので、Linux と macOS のワークフローにきれいに貼り付きます。Windows ツールで CRLF が必要なら、結果を Windows 対応のエディタに貼り付け、欲しい改行で保存してください。
エンコーディング入力は UTF-8 として扱われます(ブラウザ内のテキストはすでにデコード済みです)。先頭の UTF-8 BOM があれば最初の行に保持されます。剥がしたい場合は姉妹ツールの whitespace-cleaner が消してくれます。

行のソート: よくある質問

デフォルトの sort 順は何ですか?

ロケール対応の昇順で、ページのロケールでブラウザの Intl.Collator を使います。これは Excel と Google Sheets が並べるのと同じ A < a < B < b の順で、すべての大文字がすべての小文字より前に来る生の codepoint 順ではありません。codepoint 順がほしい場合は大文字小文字を区別するオプションをオンにしてください。これは collator を厳密な三次レベル比較に切り替え、LC_ALL=C sort と同じ並びになります。

sort は大文字小文字を区別しますか、しませんか?

デフォルトでは区別しません。AppleappleAPPLE はすべて同じキーにつぶれるので、出力で隣り合い、その相対順序は入力で先に出てきた順です(sort は安定です)。大文字小文字を区別をオンにすると分かれ、APPLEAppleapple が Unicode のデフォルト collation の三次レベルに従って 3 つの異なる値としてソートされます。

file2 が file10 より前に来るような natural sort には対応していますか?

はい。Natural sort オプションをオンにすると、埋め込まれた数値が数値として比較されるので、file2.logfile10.log より前、v1.9v1.10 より前に来ます。実装は Intl.Collatornumeric: true オプションで、macOS Finder と Windows Explorer がファイル名を並べるのと同じプリミティブです。

逆順(Z から A)でソートできますか?

はい。順序トグルで Descending を選びます。sort はまず昇順で走り、その後反転します。これにより、等しいキー間の安定性が保たれます。つまり、ふたつの行が大文字小文字と natural sort の設定の下で等しく比較されるなら、反転後も元の相対順序を保ちます。これは TSV の最初の列のような部分キーでソートするときに効きます。

重複行と空行はどうなりますか?

デフォルトでは両方とも保持されます。sort は安定なので、重複は元の相対順序を保ち、空行は昇順では先頭に集まります(空でない文字列のどれよりも前にソートされるからです)。ソート前に空行を落とすには Remove blank lines を、等しい行をひとつにまとめるには Remove duplicates をオンにしてください。より多くのオプションがある専用のデデュープ処理がほしい場合は、重複行の削除 を使ってください。

サイズ制限はありますか?

約 100,000 行までならブラウザでサブ秒で動きます。500,000 行を超えると体感し始めますが、これは主に sort 自体ではなく結果ペインのレンダリングが重くなるからです。数百万行のファイルには、unix の sort コマンドを使った LC_ALL=C sort -u file.txt のほうが速く、外部メモリで動きます。知っておく価値のあるフラグは GNU coreutils sort マニュアル がカバーしています。

プライバシーと仕組み

あなたのテキストはブラウザから出ません。分割、比較、結合のすべてがローカルで動きます。入力に対する分析もログもサーバー往復もありません。比較自体は、ブラウザネイティブの Intl.Collator で、Unicode Collation Algorithm (UTS #10) を実装しています。背景の読み物がほしければ、Wikipedia の ソート 全般の概要が良くまとまっています。