確認のみ整理・削除

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行)
betaalphabeta
alphabetaalpha
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 などを足すと比較対象が変わります。このページは行全体を比較する指定に限定しています。

GNU公式:uniq が隣接する行を比較する仕組み(英語)

数字の大小で並べたい場合は、文字列順・数値順を比べる sort の例を確認してください。

使い方を順番に確認する練習を始めるときは、この手順に沿って進めます

使い方

  1. Linuxのターミナルを開き、pwd と ls で現在地・対象を確認します。
  2. 例に出てくるファイル名・フォルダ名を、自分の環境に合わせます。読み取り・検索・コピー・移動の対象は、実際に存在するものを指定してください。
  3. 下の注意点を読んだうえでコマンドを入力し、Enterで実行します。

実行するとどうなる?

4行の入力を2行にまとめる例で、sort -u と uniq の違いを確認します。離れた重複もまとめ、元ファイルは変更しません。 このコマンド例はファイルの内容を変更しません。

注意点

元の行順は保たれません。元ファイルは変更しません。

権限に関する注意:アクセス拒否の原因を調べずに、管理者権限や sudo で実行しないでください。

うまくいかないときに確認するエラーや想定と違う結果が出たときの確認ポイント

うまくいかないとき

「No such file or directory」が出たら、現在地・名前・大文字と小文字を確認します。「Permission denied」が出たら、自分が操作してよい場所か確認してください。原因を調べずに sudo を付けないでください。

対象環境:GNU/Linux・Bash。環境やバージョンによって表示が異なる場合があります。

公式マニュアルで詳しく確認する(英語)

同じカテゴリのコマンド

コマンド一覧に戻る