【Linux】重複行を削除する方法!sortとuniqの基本と応用

【Linux】重複行を削除する方法!sortとuniqの基本と応用

Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:2797

本記事では、Linuxでテキストファイルの重複行を削除する代表的な方法を解説します。sortとuniqコマンドを組み合わせた基本手順から、出現回数の集計機能まで詳しく紹介。ログ解析やCSVデータのクレンジング作業を効率化したいエンジニア必見のテクニックをまとめました。


更新履歴


お役立ちツール



Linuxユーザにお勧めの本

Linuxでは、ログファイルや大量データの整形作業を行う際に、「重複行を削除したい」というニーズが多く発生します。特に、アクセスログ・CSVデータ・設定ファイルなどで重複行が混在していると、正確な分析や集計ができなくなります。

本記事では、sortuniqなどの定番コマンドを使って、重複行を削除するための方法を丁寧に解説します。それぞれのコマンドの特徴や使いどころ、応用例もあわせて紹介するので、業務でデータを扱う方にも役立つ内容です。

記事のポイント

  • Linuxでの重複行削除は sortuniq コマンドの組み合わせが基本。
  • uniqは隣接する重複しか認識しないため、事前のソートが必須。
  • -c(集計)、-d(重複抽出)、-u(ユニーク抽出)など分析に便利なオプションも豊富。
  • awkやcutと組み合わせることで、ログ解析やCSV整形など実務にも応用可能。

Linuxで重複行を削除する基本(sort+uniq)

Linuxで重複行を削除する際によく使われるのが、sortuniqコマンドです。これらはどのディストリビューションにも標準で搭載されており、シェルスクリプトからも簡単に利用できます。これらを理解することで、ExcelやPythonスクリプトを使わなくても、端末上で簡単にデータクレンジングを行えるようになります。

  • sort:ファイルをソート(並び替え)するコマンド。文字コード順や数値順など、さまざまな基準で並び替え可能。
  • uniq:連続して現れる重複行を削除、または分析するためのコマンド。

この2つを組み合わせることで、シンプルながら非強力な重複行削除が実現できます。例えば、ログファイルの中で同じリクエストURLを1回だけ残したい場合などに便利です。

sortuniqを組み合わせた基本的な削除方法

最も基本的かつ確実な方法が、以下のようにsortuniqを組み合わせる方法です。

コマンド構文
sort ファイル名.txt | uniq > 出力ファイル名.txt

このコマンドは、ファイルの内容をソートしたうえで、uniqで隣接する重複行を削除します。uniq連続している同一行のみを比較するコマンドです。 そのため、離れた場所にある重複行を削除する場合は、事前にsortで並び替える必要があります。

例として、以下のようなファイルを考えます。

apple
banana
apple
orange
banana
Apple

この場合、

実行コマンド例
sort sample.txt | uniq > result.txt

を実行すると、result.txtには以下の結果が出力されます。

Apple
apple
banana
orange

ファイル内の重複行を簡単に取り除けることがわかります。また、sort -uを使えば、uniqを省略して同じ結果を得ることもできます。 -uオプションはソートと同時に重複行を削除する機能を持っています。

実行コマンド例
sort -u sample.txt > result.txt

そのため、結果としては次のコマンドと同等になります。

Terminal window
sort sample.txt | uniq

uniqコマンドを用いた重複行の抽出・分析

uniqは単なる重複削除ツールではなく、重複の「可視化」や「分析」にも利用できます。以下に代表的なオプションを目的別に紹介します。

重複している行の出現回数をカウントする(-c)

実行コマンド例
sort sample.txt | uniq -c

出力例:

1 Apple
2 apple
2 banana
1 orange

行の左側に出現回数が表示されるため、どのデータが重複しているかを一目で把握できます。

重複している行だけを抽出する(-d)

実行コマンド例
sort sample.txt | uniq -d

出力例:

apple
banana

同じ内容が2回以上現れる行だけを抽出します。

重複していないユニークな行だけを抽出する(-u)

実行コマンド例
sort sample.txt | uniq -u

出力例:

Apple
orange

重複していないユニークなデータだけを抽出する際に有用です。

大文字・小文字を区別せずに比較する(-i)

実行コマンド
sort -f sample.txt | uniq -i

出力例:

Apple
banana
orange

なお、sortだけで処理する場合は以下のように書くこともできます。

Terminal window
sort -fu sample.txt

-fは大文字小文字を区別せずにソートするオプションです。また uniq -i は比較時に大文字小文字を無視します。そのため、大文字小文字を無視した重複削除を行う場合はsort -funiq -i を組み合わせる必要があります。

こうしたオプションを組み合わせると、単なる削除ではなく「重複データの検出」や「集計」も効率的に行えます。

実務で役立つLinuxでの重複行削除の応用例

実際のエンジニアの現場では、単なるテキストファイルの重複削除だけでなく、ログファイルやCSVデータの特定の列に対して処理を行うケースがよくあります。

アクセスログから重複IPアドレスを削除・集計する

ApacheやNginxのアクセスログなどから、アクセス元のIPアドレス(例:ログの1列目)だけを抽出し、アクセスの多い順にランキング表示するようなケースです。

実行コマンド例
awk '{print $1}' access.log | sort | uniq -c | sort -nr

出力例:

150 192.168.1.10
85 192.168.1.25
12 10.0.0.5

awkでIPアドレスの列だけを切り出し、sortuniq -cで出現回数をカウント後、さらにsort -nr(数値として降順ソート)することで、アクセスの多いIPを簡単に特定できます。

CSVファイルから特定列を切り出して重複削除する

CSVデータの特定列(例えば2列目のメールアドレスなど)だけを取り出して一意なリストを作りたい場合は、cutコマンドと組み合わせます。

実行コマンド例
cut -d ',' -f 2 users.csv | sort | uniq > unique_emails.txt

※この方法はシンプルなCSV(カンマ区切りのみ) を前提としています。 引用符付きCSV(例:"John, Jr.")などの複雑な形式では、awkやCSV専用ツールを使う方が安全です。

awkを使ったソートしない重複削除(おすすめ)

実務上で「元の行の順序を保持したまま」重複行を削除したい場合は、awkを使用する以下のワンライナーが非常によく使われます。

実行コマンド例
awk '!seen[$0]++' sample.txt

※補足: seen[$0]++ は、行全体($0)をキーとして出現回数を配列に記録し、初めて出現した行(カウントが0のとき)だけを出力するawkの定番イディオムです。

このコマンドの特徴は以下の通りです。

  • ソートせずに重複削除が可能
  • 元ファイルの順序を保持できる

例として以下のようなデータがあったとします。

apple
banana
apple
orange

実行後(出力例):

apple
banana
orange

uniqsortでは行の並び順が変わってしまいますが、この書き方であれば順序を維持できます。アクセスログの解析や時系列データなど、発生順序が重要な場面で非常によく使われるプロのテクニックとして覚えておきましょう。

Linux重複行削除まとめ

Linuxで重複行を削除する際は、用途やデータの性質に応じて以下のように使い分けましょう。

  • 重複削除sort ファイル | uniq または sort -u
  • 分析・可視化用途uniq -c(出現回数のカウント)、uniq -d(重複行のみ抽出)、uniq -u(ユニークな行のみ抽出)

sortuniqはいずれも軽量かつ高速に動作するテキスト処理コマンドです。ログ解析やデータ前処理など、日常的な業務におけるデータ整理を効率化する上で欠かせないツールといえるでしょう。

なお、uniq隣接する行のみを比較する仕様のため、ファイル全体の重複を削除する場合は sort と組み合わせて使用するのが一般的です。

あわせて読みたい

ログ解析やデータ抽出の作業では、grepコマンドによる特定文字列の検索も頻繁に行われます。複数ファイルから対象行を再帰的に検索したい場合は、以下の記事もぜひ参考にしてみてください。

【Linux】grepコマンドで再帰的な検索をする方法
ITナレッジライフ

【Linux】grepコマンドで再帰的な検索をする方法

Linuxでファイル内容の再帰的な検索をする場合は、grepコマンドのrオプションを利用します。またlオプションと組み合わせることで、該当ファイルの一覧も取得することができます。

この記事はお役に立ちましたか?



Linuxユーザにお勧めの本


以上で本記事の解説を終わります。
よいITライフを!
目次

記事を評価

Thanks!
Scroll to Top