リストの並べ替え、重複行の削除、余分な空白の除去——こうした「テキストをそろえる」作業は、データ整理・ログ調査・原稿チェックなど日常のあらゆる場面で発生します。一つひとつは単純でも、「何を同じとみなすか」「どの順で並べるか」という基準を取り違えると結果が変わってしまいます。本記事では行操作の基本テクニックを、つまずきやすいポイントとあわせて整理します。
1. 日常で必要になる「テキスト整形」とは
テキスト整形とは、改行で区切られた行の集まりに対して、並べ替え・重複削除・空白除去などの加工を施し、扱いやすい形に整えることです。たとえば次のような場面で必要になります。
- スプレッドシートやフォームから貼り付けたリストの重複を消してユニークな一覧にする。
- メールアドレスやキーワードをあいうえお/ABC 順に並べ替えて見やすくする。
- ログやコピペ原稿から空行や行末の空白を取り除いて差分を取りやすくする。
- 抽選やランダム表示のために行をシャッフルする、確認のために逆順にする。
いずれも「行という単位をどう扱うか」が共通のテーマです。まずは並べ替えから見ていきます。
2. 行のソート — 昇順・降順と「辞書順 vs 数値順」
ソート(並べ替え)には、小さい順に並べる昇順と、大きい順に並べる降順があります。さらに重要なのが、「文字として並べる(辞書順)」のか「数として並べる(数値順)」のかという違いです。
辞書順は先頭の文字から1文字ずつ文字コードを比べます。そのため数字を含む行では直感に反する並びになりがちです。
| 入力 | 辞書順(昇順) | 数値順(昇順) |
|---|---|---|
| 2 | 10 | 2 |
| 10 | 100 | 10 |
| 100 | 2 | 100 |
辞書順では「10」「100」が「2」より前に来ます。先頭の文字 1 が 2 より小さいと判定されるためで、桁数は考慮されません。番号・バージョン・金額のように数として並べたいときは数値順を選びます。
A と a をどう並べるか)や、アクセント付き文字・かな漢字の並びは、ロケール対応の比較(JavaScript なら localeCompare)かどうかで差が出ます。アルファベットだけの単純なケースでは気になりませんが、多言語混在のリストでは比較方式を意識しましょう。
3. 重複行の削除 — 「完全一致」の基準と順序保持
重複削除は、同じ内容の行を1つだけ残して他を消す処理です。ポイントは「何をもって同じ行とみなすか」です。多くのツールは行全体の完全一致を基準にするため、見た目が似ていても次のような違いがあると「別の行」として残ります。
- 大文字・小文字の違い(
Appleとapple)。 - 前後の空白の有無(
fooとfoo)。 - 全角・半角の違い(
ABCとABC)。
意図どおりに消すには、先に trim で空白をそろえる、大文字小文字を統一するなど、比較の基準を整えてから重複削除をかけるのが確実です。
もう一つの軸が順序の扱いです。重複削除には大きく2つのやり方があります。
- 出現順を保持:最初に現れた行を残し、2回目以降だけを消す。元の並びを崩したくないときに使います。
- ソート後に隣接重複を削除:先に並べ替えてから、連続する同じ行をまとめる。コマンドラインの
sort | uniqがこの方式です(後述)。
uniq は「連続した重複」しか消しません。離れた位置にある重複は残るため、sort で先に隣り合わせてから uniq に渡すのが定石です。順序を保ったまま全重複を消したいときは、この方式ではなく「出現順保持」のモードを使います。
4. 空行・前後空白の除去 — trim と不可視文字
trim(トリム)は、各行の先頭と末尾の空白を取り除く処理です。コピー&ペーストの際に紛れ込む余分な空白は、目では見えないのに重複削除やソートの結果を狂わせる代表的な原因です。trim の対象には、半角スペースだけでなく次のような不可視文字も含めると効果的です。
- タブ(
\t):表計算ソフトからの貼り付けで混入しやすい。 - 全角スペース(
U+3000):日本語入力で意図せず入ることがある。 - 復帰文字(CR,
\r):Windows と他環境の改行コードの違いで行末に残ることがある。
あわせて空行の削除も整形の定番です。段落の区切りで入れた空行や、末尾に並んだ無数の空行は、行数カウントや差分比較のノイズになります。trim で各行を整えてから空行を除くと、内容のある行だけがきれいに残ります。
5. 逆順・シャッフルなどの並べ替え
ソート以外にも、用途に応じた並べ替えがあります。
- 逆順:行の並びを上下そのまま反転します。ログを新しい順/古い順に切り替える、ソート結果を降順に直すといった用途に手早く使えます。
- シャッフル:行をランダムに並べ替えます。抽選候補の順序付けや、テストデータの偏りをなくす目的で使います。公平なシャッフルには Fisher–Yates 法のような偏りのないアルゴリズムが用いられます。
これらは「内容は変えず、並びだけを変える」操作です。重複削除や trim と組み合わせると、「重複を消してから逆順にする」「空行を取ってからシャッフルする」といった一連の整形を一気に行えます。
6. コマンドライン(sort / uniq)との対応とブラウザツール
ここまでの操作は、Unix 系のコマンドライン(macOS / Linux のターミナル)でも定番として使われてきました。代表的な対応は次のとおりです。
| やりたいこと | コマンド例 | 補足 |
|---|---|---|
| 昇順ソート | sort file.txt | 辞書順。数値順は sort -n |
| 降順ソート | sort -r file.txt | 逆順に並べる |
| ソート+重複削除 | sort file.txt | uniq | 連続重複のみ消えるので sort が前提 |
| 逆順(行反転) | tac file.txt | ファイル全体を上下反転 |
| シャッフル | shuf file.txt | ランダムに並べ替え |
コマンドラインは大量データやスクリプト化に強い一方、環境構築やオプションの暗記が必要です(uniq が連続重複しか消さない、全角スペースの扱いに注意、など)。ちょっとしたリスト整理であれば、ブラウザ上で貼り付けてボタンを押すだけのオンラインツールが手軽です。インストール不要で、データが手元のブラウザ内だけで処理される点も安心材料になります。
よくある質問(FAQ)
重複削除はどこまでを「同じ行」とみなすのですか?
多くのツールは行全体の完全一致を基準にします。つまり大文字・小文字、前後の空白、全角・半角の違いがあれば別の行として扱われ、削除されません。意図どおりに重複を消すには、先に前後の空白を除去(trim)したり、大文字小文字をそろえたりして「比較の基準」を整えてから重複削除を行うのが確実です。出現順を保ったまま2回目以降だけを消すモードと、ソートしてから連続する重複だけを消すモードがある点にも注意します。
辞書順と数値順のソートは何が違うのですか?
辞書順(文字列順)は1文字ずつ文字コードで比較するため、「10」より「2」が後ろに来ます(先頭の「1」と「2」を比べて「1」が小さいと判断されるため)。数値順は行を数値として解釈して大小を比べるので、2・10・100 が期待どおりに並びます。番号やバージョン、金額のように数として並べたいときは数値順、ID文字列やキーワードのように文字として並べたいときは辞書順を選びます。
trim(トリム)とは何ですか?
trim は各行の先頭と末尾にある空白文字を取り除く処理です。半角スペースだけでなく、タブや全角スペース、行末に紛れ込んだ復帰文字(CR)なども対象に含めると、見た目では分からない不一致を解消できます。コピー&ペーストで混入した余分な空白や不可視文字は、重複削除やソートの結果を狂わせる原因になるため、整形の最初に trim をかけておくと後工程が安定します。