Linuxのuniqコマンドで重複行をスマートに削除する方法

Linuxでテキストファイルやログファイルを扱う際、同じ行が繰り返される「重複行」に出会うことはよくあります。こうした重複行を簡単に取り除くために便利なのが、uniqコマンドです。シンプルながら非常に強力なこのコマンドは、ソートされたデータの中から重複を除去し、スッキリとした出力を実現してくれます。本記事では、uniqコマンドの基本的な使い方から、オプションを活用した応用方法、実践的な使用例までをわかりやすく解説していきます。初心者の方にも安心して使いこなしていただけるよう、具体的なコマンド例を交えて紹介していきますので、ぜひ参考にしてください。


uniqコマンドとは?

uniqコマンドは、標準入力またはファイルから読み込んだテキストの中から、連続して重複する行を削除して出力するコマンドです。よく「重複行を削除するコマンド」として知られていますが、実は連続する重複にしか対応していないという点が重要です。

基本構文

bashコピーする編集するuniq [オプション] [入力ファイル] [出力ファイル]

例えば、次のようなファイルがあったとします。

apple
apple
banana
banana
banana
cherry
apple

このファイルにuniqを適用すると、次のような出力になります。

uniq fruits.txt

結果:

apple
banana
cherry
apple

最後のappleが残っているのは、連続していないためです。uniqは隣接した行しか判定しないため、このような出力になります。


sortコマンドとの組み合わせ

先ほどのように、重複行が連続していない場合、uniqだけではすべての重複を取り除くことができません。その場合は、まずsortコマンドを使って行を並べ替え、重複行を隣接させてからuniqを使うのが基本です。

sort fruits.txt | uniq

このようにパイプでつなぐと、すべての重複行が連続して並ぶため、uniqで完全に除去することができます。

出力結果:

apple
banana
cherry

よく使うuniqのオプション一覧

uniqにはいくつか便利なオプションがあります。それぞれを活用することで、さらに柔軟な処理が可能になります。

-c:重複の回数を表示

各行が何回出現したかを表示します。ソートされたデータと組み合わせて使うと有効です。

sort fruits.txt | uniq -c

出力例:

      3 apple
3 banana
1 cherry

-d:重複している行だけを表示

2回以上出現している行だけを抽出します。

sort fruits.txt | uniq -d

出力例:

apple
banana

-u:一度だけ現れる行を表示

一度しか出現しない行(ユニークな行)だけを表示します。

sort fruits.txt | uniq -u

出力例:

cherry

実践例:ログファイルの重複行除去

Linuxのログファイルでは、特定のメッセージが繰り返し出力されることがあります。たとえば、あるエラー行が何度も出ている場合、一覧を見やすくするために重複行を削除したいときにuniqが活躍します。

cat /var/log/syslog | sort | uniq

または、重複行の回数を確認するには:

cat /var/log/syslog | sort | uniq -c | sort -nr | head

これは、重複数の多いメッセージを上位から表示するコマンドです。トラブルシューティングの際に非常に役立ちます。


ファイルの書き換えと出力先指定

uniqコマンドは、結果を別ファイルに出力することもできます。

sort input.txt | uniq > output.txt

このようにすることで、元のファイルはそのままに、重複を取り除いたデータを新しいファイルとして保存できます。


パイプと組み合わせた活用例

Linuxの哲学「小さな部品をつなげて使う」を体現するのが、uniqと他コマンドの組み合わせです。例えば、ファイルの中のユニークな行をカウントして表示するには:

sort file.txt | uniq -c | sort -nr

また、ユニークなメールアドレスの一覧を取得するなど、テキスト処理の一部として頻繁に使われます。


uniqで注意すべきポイント

重複行を削除できない場合の原因

  • 連続していない重複には効果がない
  • 空白やタブが異なる場合、別の行とみなされる
  • 大文字と小文字の違いも区別される(case sensitive)

このような場合には、sorttrsedなどと併用して整形処理を加える必要があります。

例:大文字・小文字を無視した重複削除(すべて小文字に変換)

cat file.txt | tr '[:upper:]' '[:lower:]' | sort | uniq

まとめ

uniqコマンドは、テキスト処理において「重複行の削除」という非常に重要な役割を果たします。ただし、重複行が連続していないと削除できないという仕様があるため、sortとセットで使うのが基本です。
さらに、オプション(-c, -d, -uなど)を活用することで、単なる削除だけでなく、重複の数を把握したり、特定の行だけを抽出したりと、より実践的な使い方が可能になります。

ログ解析、CSV処理、データ整形など、幅広い場面で活用できるので、ぜひ一度ターミナルで試してみてください。uniqを使いこなせば、Linuxのテキスト処理がさらに効率よく、快適になります。

タイトルとURLをコピーしました