Linux / コマンド / uniq - 隣接する重複行を整理

uniqは、隣り合った同じ行を1つにまとめたり、繰り返し回数を表示します。ファイル全体の重複値を削除するには、通常まずソートが必要です。

離れた同じ行は uniq だけではまとまりません。全体の値を集計する場合はsortによる並べ替えで同じ行を隣接させますが、元の行順は変わります。入力順を保ったまま全体の重複を除く処理とは区別してください。

基本的な文法

uniq [オプション] [入力ファイル [出力ファイル]]

インストールされている実装とオプションは、配布版によって異なる場合があります。man uniqで現在のシステムの説明を確認してください。

使用例

隣接する重複の削除

同じ行が連続している場合、最初の行だけを出力します。

uniq events.txt

全体の重複値のカウント

ソートで同じ値を集めた後、-cで繰り返し回数を表示します。

sort names.txt | uniq -c

重複している値のみ確認

二回以上連続した値の種類を出力します。

sort names.txt | uniq -d

隣接する重複と全体の重複を区別する

uniqは連続した同じ行だけをまとめます。下記では最後のappleが前の二行から離れているため、別に残ります。

printf 'apple\napple\nbanana\napple\n' | uniq -c

例の出力(数字の前の空白は実装によって異なる場合があります):

2 apple
1 banana
1 apple

ファイル全体の同じ行を一つにまとめたい場合は、ソート後にsort ファイル | uniqを使用します。ただし、ソートは元の行順序を変更するため、入力順序が重要なログやイベント記録には必ずしも適用しないでください。-dは重複したグループだけ、-uは一度だけ現れたグループだけを表示します。

主なオプションと形式

オプション・形式 説明
-c 各出力行の前に連続発生回数を付けます。
-d 隣接して繰り返すグループごとに、代表の1行を出力します。
-u 隣接する同一行のグループが1行だけの場合、その行を出力します。ファイル全体で1回だけとは限りません。
-i 比較する際、大文字と小文字を無視します。
-f N 先頭のN個フィールドを比較から除外します。

使用する際の注意点

ロケール(言語や地域の比較規則)をそろえる場合は、LC_ALL=C sort names.txt | LC_ALL=C uniq -c のように両方のコマンドへ指定します。左側だけに付けても右側へは引き継がれません。uniq -u は隣接グループが1行だけのものを表示し、すべての値を1回ずつ出す指定ではありません。-i や -f を使えば、元の行全体が違っていても同じとみなす場合があります。入力と出力には別のファイル名を使い、元ファイルへ直接上書きしないでください。

よくある質問

離れた位置にある同じ行がuniqで残る理由は?

現在の行を直前の行と比較する方式だからです。全体の重複除去を行うには、入力をソートして同じ行をまとめてください。

公式ドキュメント

オプションの正確な動作や実装ごとの差異は、uniqに関する公式ドキュメントで確認できます。