第1回 | sort と uniq で重複チェックを速くする | 一覧を先に整えて見やすくする|UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第1回 | sort と uniq で重複チェックを速くする | 一覧を先に整えて見やすくする|UNIX Cafe

Unixコマンド実践 | 第1回

名前の一覧やメールアドレスの一覧を見ていて、「同じものが混ざっていないか」を確かめたいことがあります。件数が少なければ目で見てもよいですが、少し増えるだけで意外と見づらくなります。

今回は、sort と uniq を使って、一覧の重複を手早く確認する方法を見ていきます。ポイントは、いきなり探すのではなく、まず並べて見やすくすることです。

ターミナルにまだ慣れていない方は、「入力ファイルを1行ずつ読みながら整えていく道具」だと思って読むと入りやすいです。この記事では、1つずつコマンドを試しながら、出力がどう変わるかを確認していきます。

動画で流れを先に見たい方は、UNIX Cafe の YouTube もあわせてどうぞ。記事と同じく、初心者向けのやさしい流れで、ターミナルの最初の一歩を確認できます。

📝 この記事で学べること

  • sort で一覧を並べる意味
  • uniq で重複をまとめる考え方
  • uniq -d と uniq -c の使い分け
目次

まず sort で一覧を整える

sort は行を並べ替えるコマンドです。重複そのものを消すわけではありませんが、同じものが近くに集まるので一気に見やすくなります。

まずは、実際にどんなファイルを相手にしているのかを見ておくと安心です。たとえば members.txt が次のような内容だったとします。

sato
tanaka
suzuki
sato
yamada
tanaka
kobayashi

このファイルは「1行に1人の名前が書かれている一覧」です。sort も uniq も、基本は1行ごとに処理します。まずはこの「1行ずつ見る」という感覚を持っておくと理解しやすくなります。

sort members.txt

一覧をそのまま読む前に、先に整える。この一手だけでも確認作業はかなり楽になります。

実行すると、表示は次のように変わります。同じ名前が近くに集まるので、どこが重なっているかが目で追いやすくなります。

kobayashi
sato
sato
suzuki
tanaka
tanaka
yamada

uniq は連続した重複をまとめる

uniq は、連続している重複行を1つにまとめるコマンドです。裏を返すと、先に sort で同じ行を近くに集めておかないと、離れた場所にある重複を見逃してしまいます。そのため、sort と組み合わせて使うのが基本の流れです。

ここで出てくる | は「左の結果を右へ渡す」という意味です。つまり sort members.txt | uniq は、「sort で並べ替えた結果を、そのまま uniq に渡して処理する」という1本の流れになっています。

sort members.txt | uniq

「まず並べる」「そのあと重複を見る」という流れで覚えると、かなり使いやすくなります。

出力は次のようになります。重複していた sato と tanaka が1回ずつにまとまり、一覧がすっきりします。

kobayashi
sato
suzuki
tanaka
yamada

uniq 単体だと見逃すことがある

初心者がつまずきやすいのが、uniq は「ファイル全体の重複」を消すのではなく、「連続した重複」だけをまとめる、という点です。つまり、先に sort しないと離れた場所にある重複を見逃します。

uniq members.txt

この例では、もとの members.txt に同じ名前が離れて出てくるので、出力はほとんど変わりません。「重複が消えない」と感じたら、まず sort を入れ忘れていないかを確認すると整理しやすいです。

sato
tanaka
suzuki
sato
yamada
tanaka
kobayashi

このように、同じ sato や tanaka が離れた位置にあるままだと、uniq は別の行だとみなして通してしまいます。uniq は「隣どうしが同じか」を見るコマンド、と覚えると混乱しにくくなります。

重複だけ見る、件数まで見る

何が重複しているかだけ知りたいなら uniq -d、それぞれが何回出てきたかまで知りたいなら uniq -c が使えます。

sort members.txt | uniq -d
sort members.txt | uniq -c

同じコマンドでも、見たいものに合わせて表示の仕方を変えられるのが便利なところです。

たとえば uniq -d なら重複している名前だけが表示され、uniq -c なら何回出てきたかまで確認できます。件数の確認までできると、単に重複があるかどうか以上の情報が得られます。

sato
tanaka

      1 kobayashi
      2 sato
      1 suzuki
      2 tanaka
      1 yamada

uniq -c の左側に出る数字が件数です。たとえば 2 sato は「sato が2回あった」という意味です。件数つきで見られると、どれがどのくらい重複しているかを一度に把握できます。

よくあるミスと結果の保存方法

見た目が同じでも、Alice と alice は別扱いですし、行末に余分なスペースが入っていると別の行として扱われます。目では同じに見えるのに結果がそろわないときは、大文字小文字や空白の違いを疑うと原因を切り分けやすくなります。

また、結果をあとで見返したいなら、次のようにリダイレクトでファイルへ保存できます。

sort members.txt | uniq -c > result.txt

sort は「行を並べる」、uniq は「連続した重複をまとめる」と覚えておくと、あとで読み返したときにも手がかりになります。

手を動かすミニ練習

ここまでの内容が整理できたら、実際に練習用ファイルを作って、コマンドを試してみましょう。

まずは、ターミナルで次のコマンドを実行して fruits.txt を作ります。

cat > fruits.txt

cat > fruits.txt は、「これから入力する内容を標準入力から受け取り、 fruits.txt という名前で保存する」という意味です。

cat > fruits.txt をEnterで確定し、6行の文字を入力します。

apple
banana
Apple
banana
grape
apple

最後に Enterで確定し、 Ctrl + D を押すと6行の文字が保存されます。

Ctrl + D

ファイルの中身を確認するときは、catコマンドで中身を表示して確認できます。

cat fruits.txt

表示が次の6行になっていれば準備完了です。

apple
banana
Apple
banana
grape
apple

準備ができたら、次の3つを順番に試してみてください。

  1. uniq fruits.txt を実行して、重複が消えない行があることを確認する
  2. sort fruits.txt を実行して、Apple と apple が別々に並ぶことを確認する
  3. sort fruits.txt | uniq -c を実行して、何が何回出てきたかを読み取る

この練習では、「連続していない重複は消えない」「大文字と小文字は別扱い」という本文の要点を復習できます。手順3の uniq -c の結果では、Apple と apple が別々にカウントされているはずです。

これは sort が大文字と小文字を区別して並べるためです。大文字小文字を無視して並べたい場合は sort -f が使えますが、それは別の機会に扱います。

一覧は先に整えると確認しやすくなる

重複チェックは地味な作業ですが、いきなり探すのではなくまず並べて見やすくする、この一手だけでも進めやすくなります。sort で整えてから uniq で見る、という流れを体で覚えておくと、似たような場面でも少しずつ使いやすくなります。Unix コマンド実践シリーズでは、こうした「日常の小さな手作業をどう減らすか」を中心に見ていきます。

次回予告

次回は、cut を使って CSV や区切り付きテキストから必要な列だけを抜き出す方法を見ていきます。全部を見る前に、まず必要な情報だけへ絞る流れを整理します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次