Linux の uniq (ユニーク) コマンドは、テキスト処理において不可欠なツールです。テキストファイル内の重複行をフィルタリングおよび管理するのに役立ちますが、効果的に使用するにはその動作を理解することが重要です。
基本的な重複行の削除
uniq コマンドの主な機能は、隣接する重複行を削除することです。以下のような内容の reading.txt というファイルがあると想像してください。
book
book
paper
paper
article
article
magazine
重複行を削除するには、uniq コマンドを実行します。
$ uniq reading.txt
book
paper
article
magazine
ご覧のとおり、uniq は隣接する重複行が削除されたバージョンのファイルを出力します。
高度なフィルタリングオプション
uniq コマンドには、より詳細な分析のためのいくつかのオプションも用意されています。
各行の出現回数をカウントするには、-c (count) フラグを使用します。
$ uniq -c reading.txt
2 book
2 paper
2 article
1 magazine
重複していない行(つまり、一意な行)のみを表示するには、-u (unique) フラグを使用します。
$ uniq -u reading.txt
magazine
逆に、重複している行のみを表示するには、-d (duplicated) フラグを使用します。
$ uniq -d reading.txt
book
paper
article
ソートの重要性
uniq linux コマンドに関する重要な点は、重複行を検出するのは、それらが互いに隣接している場合に限られるということです。重複がファイル全体に散らばっている場合、uniq はそれを識別しません。
重複が隣接していない reading.txt のバージョンを考えてみましょう。
book
paper
book
paper
article
magazine
article
このファイルに対して uniq を実行すると、驚くべき結果が得られます。
$ uniq reading.txt
book
paper
book
paper
article
magazine
article
隣接する同一の行がなかったため、行は削除されませんでした。これを解決するには、まずファイルのコンテンツをソートする必要があります。sort の出力を uniq にパイプすることで、すべての同一行が隣接することが保証され、uniq が正しく機能するようになります。この組み合わせは、シェルスクリプトにおける強力で一般的なパターンです。
$ sort reading.txt | uniq
article
book
magazine
paper
このコマンドは、まず行をアルファベット順にソートし、次に uniq が重複をフィルタリングして、クリーンな一意のエントリのリストを提供します。