ファイル内から重複する行を削除し、ユニークな文字列のみを取得するには、sort コマンドと uniq コマンドを組み合わせて利用します。
uniq コマンドは「直前の行と連続して重複している行」を1行にまとめる性質があります。
そのため、あらかじめ sort コマンドで同じ文字列の行を並び替えてから uniq コマンドに渡すことで、
ファイル全体の重複を完全に排除することができます。
■目次
以下は、data.txt というファイルから重複を除いたユニークな行を取得する例です。 実務ではどちらの方法もよく使われますが、通常はパイプ(|)が1つで済む1番目の方法がシンプルで推奨されます。
sort コマンドの -u(unique)オプションを使うと、ソートと重複排除を1つのコマンドだけで同時に実行できます。
パイプ(|)を使わないため、最も処理が高速でスマートな書き方です。
sort -u data.txt
一度 sort で並び替えた結果を、パイプを介して uniq に渡す方法です。
sort data.txt | uniq
cat data.txt | sort | uniq
※動作は同じですが、無駄なコマンド(cat)やパイプが増えるため、大きなファイルを処理する際は上記の「1」や「2」の方法が推奨されます。
リダイレクト(>)を使って、重複を排除した結果を新しいファイル(result.txt)に保存できます。
sort -u data.txt > result.txt
元となるデータファイル(data.txt)の中身と、コマンドを実行した結果の比較です。
$ cat data.txt RED GREEN BLUE RED RED PINK YELLOW GRAY GREEN YELLOW BLUE
$ sort -u data.txt BLUE GRAY GREEN PINK RED YELLOW
Linuxのテキスト処理において、sort と uniq の組み合わせは、ログファイルの解析やデータのクレンジングなど、実務のあらゆる場面で頻出する最も基本かつ強力なテクニックの一つです。
最初はパイプ(|)を使った組み合わせに戸惑うかもしれませんが、それぞれのコマンドの役割(「並び替える」と「連続した重複を消す」)を意識すると、仕組みがすんなりと理解できるようになります。
この基本をマスターすれば、大規模なデータから必要な情報だけを瞬時に抽出できるようになり、作業効率が劇的にアップします。ぜひコマンドを実際に叩いて、その便利さを体感してみてください!