uniq コマンドは、入力中の連続した重複行をまとめて処理するためのコマンドです。
デフォルトでは、連続して同じ内容の行が現れた場合に、そのうち 1 行だけを出力します(重複の圧縮)。
ただし、uniq は「連続した」重複しか認識しないため、
行の並びがバラバラなデータに対して重複をまとめたい場合は、あらかじめ sort コマンドなどでソートしておく必要があります。
オプションを使うことで、
- 行ごとの出現回数をカウントする(
-c) - 重複している行だけを取り出す(
-d) - 一度しか出てこない行だけを取り出す(
-u)
といった処理が可能で、ログ解析や一覧データの集計でよく利用されます。
uniq [オプション] [入力ファイル [出力ファイル]]
入力ファイルを指定しない場合は標準入力から読み込み、出力ファイルを指定しない場合は標準出力に結果を出力します。
重複行を正しく扱うためには、基本的に事前にソートしておくのがポイントです。
単純な「重複削除」だけでなく、「何回出てきたか」「ユニークな値だけ欲しい」といった用途に向いています。
・連続する重複行を 1 行にまとめて出力する(基本)
uniq input.txt
input.txt の中で、連続して同じ内容になっている行を 1 行にまとめて出力します。
既にソート済みのファイルに対して使うと、「重複行の圧縮」として分かりやすく動作します。
・ソートと組み合わせて重複行をまとめて削除する
sort input.txt | uniq > unique.txt
まず sort で行の順序をソートし、その結果に対して uniq を適用する定番パターンです。
これにより、ファイル内に同じ行が複数回出現していても、1 行だけにまとめた結果を unique.txt に得ることができます。
・重複行を削除しつつソートもまとめて行う(sort -u)
sort -u input.txt > unique.txt
sort の -u(–unique)オプションを使うことで、ソートと uniq 的な処理を 1 回で行うこともできます。
ただし、本記事では uniq の挙動を理解するために、まずは sort ... | uniq の形で覚えておくのがおすすめです。
・各行の出現回数を付けて出力する(-c)
sort input.txt | uniq -c
-c(–count)は、各行の出現回数を行頭に付けて出力します。
どの値が何回出ているかをざっくり知りたいときに便利です。
見やすくしたいときは sort -nr などで数の多い順に並べ替えることもできます。
・重複している値だけを抽出する(-d)
sort input.txt | uniq -d
-d(–repeated)は、2 回以上出現している行だけを出力します。
ユニークでない値だけを知りたいとき(重複チェックなど)に使えます。
・一意な値だけを抽出する(-u)
sort input.txt | uniq -u
-u(–unique)は、1 回しか出現しない行だけを出力します。
唯一の値や、重複していないレコードだけを抽出したいときに便利です。
・大文字小文字を区別せずに重複をまとめる(-i)
sort -f input.txt | uniq -i
-i(–ignore-case)は、大文字小文字の違いを無視して比較します。
Foo と foo を同じ行とみなして重複を処理したい場合に使えます。
・先頭の n フィールド(列)を無視して比較する(-f)
sort input.txt | uniq -f 1
-f N(–skip-fields=N)は、先頭から N 個のフィールドを無視して比較します。
先頭列に日付や ID などの変動部分があり、その後ろの内容が同じものをまとめたいときに使えます。
フィールドの区切りは空白文字が対象です。
・先頭の n 文字を無視して比較する(-s)
sort input.txt | uniq -s 10
-s N(–skip-chars=N)は、行頭から N 文字を無視して比較します。
固定長レコードで、先頭のタイムスタンプ部分を無視して重複判定したい場合などに役立ちます。
・比較に使う文字数(幅)を制限する(-w)
sort input.txt | uniq -w 8
-w N(–check-chars=N)は、行頭から N 文字分だけを比較対象として扱います。
行の一部だけをキーとして重複判定したい場合に、-s と組み合わせて使うこともあります。
・同じ行が連続している部分をすべて出力する(-D)
sort input.txt | uniq -D
-D(–all-repeated)を指定すると、重複している行をまとめて全行出力します。
デフォルトの uniq は重複行のうち 1 行だけを残しますが、-D を使うと重複している部分をすべて確認できます。
・ログからユニークな IP アドレスや URL を抽出する
awk '{print $1}' access.log | sort | uniq のように、
まず欲しいフィールドだけ抜き出してから uniq で重複をまとめる、という使い方は定番です。
uniq -c と組み合わせれば、「どの IP から何回来ているか」といった集計も簡単に確認できます。
・設定ファイルやリストの重複チェック
ホスト一覧やユーザ一覧などのリストに重複が紛れ込んでいないか確認したいとき、
sort list.txt | uniq -d で重複行だけをチェックできます。
CI やテストの一部として組み込んでおくのも有効です。
・バッチ処理結果のユニークデータ抽出
バッチ処理で生成されたファイルから、ユニークなキーだけを取り出したい場合に、
sort -u や sort | uniq を使うことがよくあります。
件数を数える場合は sort | uniq | wc -l というパターンがよく登場します。
・簡易的な分布確認・ランキング
sort input | uniq -c | sort -nr | head とすることで、
「どの値がどれくらい出ているか」「上位 N 件は何か」を手軽に確認できます。
本格的な集計の前に、ざっくり傾向を見たいときに便利です。
uniq コマンドを使いこなすポイントは、「連続した」重複のみを扱うという性質と、
sort との組み合わせをセットで覚えることです。
ログ解析やリスト処理で、sort | uniq -c を繰り返し叩いているだけでも、だいぶ見えるものが変わってきます。
| short option | long option | description |
|---|---|---|
| -c | --count | 各行の出現回数を行頭に付けて出力する |
| -d | --repeated | 2 回以上出現する重複行だけを出力する |
| -u | --unique | 1 回しか出現しない一意な行だけを出力する |
| -i | --ignore-case | 大文字小文字の違いを無視して行を比較する |
| -f | --skip-fields | 先頭から指定したフィールド数だけを無視して比較する(フィールド区切りは空白) |
| -s | --skip-chars | 行頭から指定した文字数だけを無視して比較する |
| -w | --check-chars | 行頭から指定した文字数分だけを比較対象としそれ以降は無視する |
| -D | --all-repeated | 重複している行を 1 行だけでなく同じ行をすべて出力する |
| -z | --zero-terminated | 行末の区切り文字として改行ではなくヌル文字を使用する(他コマンドの -z と組み合わせる用途など) |
| -h | --help | uniq コマンドの使い方(ヘルプ)を表示して終了する |
| --version | uniq コマンドのバージョン情報を表示して終了する |
ここでは、GNU coreutils の uniq コマンドで一般的によく使われる主なオプションを TablePress の表としてまとめている想定です。
実際に利用できるオプションや挙動は、ディストリビューションやバージョンによって異なる場合があるため、
本番環境で使用する前に man uniq で最新の仕様を確認してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
