はじめに

こんにちは!今回はuniqコマンドについて解説します。

uniqは、連続する重複行を削除・検出するコマンドです。ログファイルの集計やデータのクリーニングに使います。sortとセットで使うことが多いコマンドです。

uniqコマンドとは

uniqは、連続する同じ行を1つにまとめるコマンドです。

重要なポイントは「連続する」という点。非連続の重複は検出できないので、通常はsortしてからuniqを使います。また、重複をカウントしたり、重複行だけ抽出したりもできます。

基本構文

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

主なオプション

オプション 説明
-c 各行の出現回数をカウント
-d 重複している行のみ表示
-u 重複していない(一意な)行のみ表示
-i 大文字小文字を区別しない
-f N 最初のN個のフィールドをスキップ
-s N 最初のN文字をスキップ
-w N 最初のN文字のみ比較

使用例

例1: 基本的な重複削除

1
2
3
4
5
6
7
8
9
# data.txt の内容
# apple
# apple
# banana
# banana
# banana
# orange

uniq data.txt

実行結果:

1
2
3
apple
banana
orange

連続する重複行が削除されます。

例2: sortと組み合わせて全重複を削除

1
2
3
4
5
6
7
8
# unsorted.txt の内容
# apple
# banana
# apple
# orange
# banana

sort unsorted.txt | uniq

実行結果:

1
2
3
apple
banana
orange

sortしてからuniqを使うと、すべての重複が削除されます。

例3: 重複回数をカウント

1
2
3
4
5
6
7
8
9
# fruits.txt の内容
# apple
# apple
# apple
# banana
# banana
# orange

uniq -c fruits.txt

実行結果:

1
2
3
      3 apple
      2 banana
      1 orange

各行が何回出現したかカウントされます。

例4: 重複行のみ表示

1
uniq -d fruits.txt

実行結果:

1
2
apple
banana

2回以上出現した行だけ表示されます。

例5: 一意な行(重複していない行)のみ表示

1
uniq -u fruits.txt

実行結果:

1
orange

1回だけ出現した行のみ表示されます。

例6: 大文字小文字を区別しない

1
2
3
4
5
6
7
# mixed.txt の内容
# Apple
# apple
# APPLE
# Banana

uniq -i mixed.txt

実行結果:

1
2
Apple
Banana

大文字小文字を無視して重複判定します。

例7: 特定のフィールドをスキップ

1
2
3
4
5
6
# log.txt の内容
# 2024-01-01 Error message
# 2024-01-02 Error message
# 2024-01-03 Warning message

uniq -f 1 log.txt

実行結果:

1
2
2024-01-01 Error message
2024-01-03 Warning message

最初の1フィールド(日付)をスキップして、残りで重複判定。

例8: 最初の数文字をスキップ

1
2
3
4
5
6
# lines.txt の内容
# ID001:apple
# ID002:apple
# ID003:banana

uniq -s 6 lines.txt

実行結果:

1
2
ID001:apple
ID003:banana

最初の6文字(“ID001:“部分)をスキップして比較。

例9: 最初の数文字のみで比較

1
2
3
4
5
6
# codes.txt の内容
# AB123
# AB456
# CD789

uniq -w 2 codes.txt

実行結果:

1
2
AB123
CD789

最初の2文字のみで重複判定。

例10: 結果をファイルに保存

1
uniq data.txt unique_data.txt

または

1
sort data.txt | uniq > unique_data.txt

実践的な使い方

ログファイルから一意なエラーメッセージを抽出

1
grep "ERROR" app.log | sort | uniq

アクセスログから一意なIPアドレスを抽出

1
cut -d ' ' -f 1 access.log | sort | uniq

最も多く出現する行トップ10

1
sort file.txt | uniq -c | sort -rn | head -10

よく使うパターンです。出現回数でソートしてトップ10を表示。

重複行のみ抽出してカウント

1
sort file.txt | uniq -cd | sort -rn

重複している行だけを、出現回数の多い順に表示。

2回以上出現する行を検出

1
sort file.txt | uniq -d > duplicates.txt

ユニークな値の数をカウント

1
sort file.txt | uniq | wc -l

何種類の異なる行があるかカウント。

メールアドレスのドメインを集計

1
cut -d '@' -f 2 emails.txt | sort | uniq -c | sort -rn

どのドメインが多いか集計。

ログファイルから重複エラーを除外

1
grep "ERROR" app.log | sort | uniq > unique_errors.txt

CSVファイルの特定列の重複チェック

1
cut -d ',' -f 2 data.csv | sort | uniq -d

2列目に重複がある行を検出。

コマンド履歴から頻出コマンドを抽出

1
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10

よく使うコマンドトップ10。

Tips・注意点

  • 必ずsortしてから使う: uniqは連続する重複しか削除できない

    1
    2
    3
    4
    5
    
    # 間違い(非連続の重複は残る)
    uniq unsorted.txt
    
    # 正しい
    sort unsorted.txt | uniq
    
  • sortの-uとuniqの違い: 基本的には同じだが、uniqの方が機能が多い

    1
    2
    
    sort -u file.txt        # 重複削除のみ
    sort file.txt | uniq -c # カウントもできる
    
  • 空行も処理される: 連続する空行も1つにまとめられる

    1
    
    uniq file.txt
    
  • フィールド区切りはスペース: デフォルトの区切り文字はスペース/タブ

    1
    
    uniq -f 2  # スペース区切りで3列目以降を比較
    
  • -cの出力形式: 左揃えで数値、その後にスペース、行内容

    1
    2
    
    uniq -c file.txt
    # 出力例: "      5 apple"
    

sortとuniqの組み合わせパターン

パターン1: 重複削除

1
sort file.txt | uniq

または

1
sort -u file.txt

パターン2: 出現回数を数える

1
sort file.txt | uniq -c

パターン3: 重複行だけ抽出

1
sort file.txt | uniq -d

パターン4: 出現回数でソート

1
sort file.txt | uniq -c | sort -rn

パターン5: 一意な行だけ抽出

1
sort file.txt | uniq -u

uniqとawkの比較

同じことをawkでもできますが、uniqの方がシンプルです。

1
2
3
4
5
# uniq
sort file.txt | uniq -c

# awk(同じ結果)
sort file.txt | awk '{count[$0]++} END {for (i in count) print count[i], i}'

シンプルな処理ならuniq、複雑な処理ならawkが向いています。

まとめ

今回はuniqコマンドについて解説しました。

ポイント:

  • uniqで連続する重複行を削除できる
  • -cで出現回数をカウント
  • -dで重複行のみ、-uで一意な行のみ表示
  • -iで大文字小文字を区別しない
  • 通常はsortと組み合わせて使う
  • sort | uniq -c | sort -rnで頻度分析

uniqsortとセットで使うことで真価を発揮します。ログ解析やデータの集計で頻繁に使うので、sortとの組み合わせパターンを覚えておくと便利です。

次回もLinuxコマンドの学習を続けていきましょう!