sort -u:離れた重複行も1行にまとめたい
4行の入力を2行にまとめる例で、sort -u と uniq の違いを確認します。離れた重複もまとめ、元ファイルは変更しません。
コマンド例
printf '%s\n' beta alpha beta beta | LC_ALL=C sort -u離れた重複も、4行から2行にまとめる
上の例はファイルを使いません。printf で練習用の4行を作り、| で次のコマンドに渡します。LC_ALL=C は今回の比較条件をそろえる指定で、元の行順は保ちません。
| 入力(4行) | sort -u(2行) | uniq だけ(3行) |
|---|---|---|
| beta | alpha | beta |
| alpha | beta | alpha |
| beta | — | beta |
| beta | — | — |
sort -u は並べ替えて同じ行を1行にします。一方、uniq だけでは隣り合う重複だけをまとめます。この入力の末尾の beta 2行は1行になりますが、先頭の beta は離れているため残ります。「1回しか出ていない行だけを選ぶ」という意味ではありません。
uniq だけの場合も比べる
printf '%s\n' beta alpha beta beta | LC_ALL=C uniq
画面には beta・alpha・beta の3行が表示されます。どちらの例も、ファイルを作成・変更しません。
既存ファイルで試す場合
LC_ALL=C sort -u ./names.txt練習用フォルダに、上の入力と同じ4行だけを書いた names.txt を用意し、そのフォルダで実行します。見出しは入れません。結果を画面に表示するだけなので、元ファイルは4行のままです。
sort -u ./names.txt > ./names.txt は使わないでください。シェルが先にファイルを空にし、元データを失うおそれがあります。保存が必要なら未使用の別名を確認します。
空の入力・違う文字・エラーを見分ける
- 空ファイルなら結果も0行です。存在しないファイルの読み取りエラーとは異なります。
- この例は小文字の英字だけです。大文字や余分な空白が混ざると別の行になります。表示が似ているだけで同一と決めつけないでください。
- 通常の比較は言語設定にも左右されます。日本語の読み仮名順を保証する例ではありません。
-nや-kなどを足すと比較対象が変わります。このページは行全体を比較する指定に限定しています。
数字の大小で並べたい場合は、文字列順・数値順を比べる sort の例を確認してください。
使い方を順番に確認する練習を始めるときは、この手順に沿って進めます
使い方
- Linuxのターミナルを開き、
pwdとlsで現在地・対象を確認します。 - 例に出てくるファイル名・フォルダ名を、自分の環境に合わせます。読み取り・検索・コピー・移動の対象は、実際に存在するものを指定してください。
- 下の注意点を読んだうえでコマンドを入力し、Enterで実行します。
実行するとどうなる?
4行の入力を2行にまとめる例で、sort -u と uniq の違いを確認します。離れた重複もまとめ、元ファイルは変更しません。 このコマンド例はファイルの内容を変更しません。
元の行順は保たれません。元ファイルは変更しません。
権限に関する注意:アクセス拒否の原因を調べずに、管理者権限や sudo で実行しないでください。
うまくいかないときに確認するエラーや想定と違う結果が出たときの確認ポイント
うまくいかないとき
「No such file or directory」が出たら、現在地・名前・大文字と小文字を確認します。「Permission denied」が出たら、自分が操作してよい場所か確認してください。原因を調べずに sudo を付けないでください。
対象環境:GNU/Linux・Bash。環境やバージョンによって表示が異なる場合があります。