Line Sorter
テキスト行をアルファベット順・逆順・文字数順・ランダムに並べ替え
入力行
並べ替え後の行
行ソートとは?
行ソートとは、テキストブロックの各行を特定のルール(アルファベット順、逆順、行の長さ、またはランダムシャッフル)に従って並べ替える処理です。ログファイル、CSVデータ、設定ファイルのリスト、その他の順序が重要なプレーンテキストコンテンツを扱う際に、行をオンラインでソートすることはよくあるタスクです。この操作は、テキストを改行文字で分割し、生成された配列に比較関数を適用して、並べ替えた行を結合します。
ほとんどのプログラミング言語はデフォルトで辞書順比較(文字のUnicodeコードポイントによる比較)を使って文字列をソートします。これはつまり、大文字が小文字より前に来る(「Banana」が「apple」より前)こと、数字が文字より前になることを意味します。ロケール対応のソート(自然ソートまたは照合順序とも呼ばれる)は、言語固有のルールを適用することでこれを修正します。JavaScriptの`localeCompare()`、Pythonの`locale.strxfrm()`、`LC_COLLATE`を指定したPOSIXの`sort`コマンドはいずれもロケール対応の順序付けを提供します。
文字数順のソートは、リスト内の最短または最長のエントリを見つけたり、ログ出力の外れ値を特定したり、複雑さの順に項目を整理したりする際に便利です。逆順ソートは既存の行の順序を反転させるだけで、Z-Aアルファベット順のソートとは異なります。ランダムシャッフルは各行にランダムなソートキーを割り当て、実行するたびに異なる順序を生成します。同じ入力に対してモードを切り替えることで、スクリプトを個別に作成するよりも高速に処理できます。
なぜこの行ソートツールを使うのか?
テキストを貼り付けてソートモードを選ぶだけで、すぐに結果が得られます。コマンドラインのセットアップ、スクリプトファイル、パッケージのインストールは不要です。
行ソートツールの活用事例
行ソートモードのリファレンス
このツールは6種類のソートモードをサポートしています。以下の表は各モードの説明、使用する比較方法、および入力リスト(apple、banana、cherry、date、fig)に対するサンプル結果を示しています。
| モード | 説明 | JSメソッド | 出力例 |
|---|---|---|---|
| A-Z | Alphabetical ascending | localeCompare() | apple, banana, cherry |
| Z-A | Alphabetical descending | localeCompare() reversed | cherry, banana, apple |
| Length (short) | Shortest line first | a.length - b.length | fig, date, apple, banana |
| Length (long) | Longest line first | b.length - a.length | banana, apple, date, fig |
| Reverse | Flip line order, no reordering | Array.reverse() | Last line becomes first |
| Random | Randomized comparator (biased) | Math.random() - 0.5 | Different every run |
内部で使われているソートアルゴリズム
JavaScriptで`Array.sort()`を呼び出すと、V8エンジン(Chrome、Node.js)は2019年以降Timsortを使用します。他のランタイムは異なるアルゴリズムを使います。以下の表は、各言語の標準ライブラリで使われる代表的なソートアルゴリズムを比較したものです。いずれも、通常の入力(10万行未満)においてこのツールの行ソート処理を1ミリ秒以内に完了します。
| アルゴリズム | 使用言語 | 時間計算量 | 備考 |
|---|---|---|---|
| Timsort | Python, Java (Arrays.sort) | O(n log n) | Stable, fast on partially sorted data |
| Quicksort | C stdlib, V8 (older) | O(n log n) | In-place, unstable by default |
| Merge sort | Most stable-sort implementations | O(n log n) | Stable, predictable, uses extra memory |
| Introsort | C++ std::sort, .NET | O(n log n) | Hybrid: quicksort + heapsort fallback |
| Radix sort | Fixed-length keys, integers | O(nk) | Non-comparative, linear for short keys |
コード例
JavaScript、Python、Go、コマンドラインで行をプログラム的にソートする方法を示します。各例では、アルファベット順、文字数順、逆順のソートを扱っています。
const text = `banana
apple
cherry
date
fig`
// Sort A-Z (locale-aware)
const az = text.split('\n').sort((a, b) => a.localeCompare(b)).join('\n')
// → "apple\nbanana\ncherry\ndate\nfig"
// Sort by line length, shortest first
const byLen = text.split('\n').sort((a, b) => a.length - b.length).join('\n')
// → "fig\ndate\napple\nbanana\ncherry"
// Reverse line order (no alphabetical sorting)
const reversed = text.split('\n').reverse().join('\n')
// → "fig\ndate\ncherry\napple\nbanana"
// Remove duplicates and sort
const unique = [...new Set(text.split('\n'))].sort().join('\n')text = """banana apple cherry date fig""" lines = text.splitlines() # Sort A-Z (case-insensitive) az = sorted(lines, key=str.lower) # → ['apple', 'banana', 'cherry', 'date', 'fig'] # Sort by line length by_len = sorted(lines, key=len) # → ['fig', 'date', 'apple', 'banana', 'cherry'] # Reverse original order rev = lines[::-1] # → ['fig', 'date', 'cherry', 'apple', 'banana'] # Shuffle randomly import random random.shuffle(lines) # modifies in place
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
text := "banana\napple\ncherry\ndate\nfig"
lines := strings.Split(text, "\n")
// Sort A-Z
sort.Strings(lines)
fmt.Println(strings.Join(lines, "\n"))
// → apple\nbanana\ncherry\ndate\nfig
// Sort by length
sort.Slice(lines, func(i, j int) bool {
return len(lines[i]) < len(lines[j])
})
fmt.Println(strings.Join(lines, "\n"))
// → fig\ndate\napple\nbanana\ncherry
}# Sort lines A-Z
sort file.txt
# Sort lines Z-A (reverse)
sort -r file.txt
# Sort numerically (first field)
sort -n data.txt
# Sort by line length (awk + sort + cut)
awk '{ print length, $0 }' file.txt | sort -n | cut -d' ' -f2-
# Shuffle lines randomly
shuf file.txt # GNU coreutils
sort -R file.txt # alternative (not truly uniform)
# Sort and remove duplicates
sort -u file.txt