uniq — 過濾相鄰重複行

過濾或報告相鄰的重複文字行(需先 sort)。

語法

uniq [選項] [輸入 [輸出]]

常用選項

選項 說明 範例
-c, --count 在每行前顯示出現次數 sort file | uniq -c
-d, --repeated 只顯示有重複的行(出現兩次以上) sort file | uniq -d
-u, --unique 只顯示沒有重複的唯一行 sort file | uniq -u
-i, --ignore-case 忽略大小寫比較 sort file | uniq -i
-f N 跳過前 N 個欄位後才開始比較 sort file | uniq -f 2
-s N 跳過前 N 個字元後才開始比較 sort file | uniq -s 3
-w N 只比較前 N 個字元 sort file | uniq -w 5

使用範例

範例 1:移除重複行(最常用)

先排序再用 uniq 去除所有重複行,等效於 sort -u。

$ sort emails.txt | uniq
alice@example.com
bob@example.com
charlie@example.com
範例 2:統計每行出現次數

加上 -c 顯示計數,再 sort -rn 排序得出「出現最多次的行」。

$ sort access.log | uniq -c | sort -rn | head -10
    352 192.168.1.105 GET /api/data
    241 10.0.0.23 POST /login
範例 3:找出只出現一次的行

使用 -u 找出所有唯一(沒有重複)的行。

$ sort items.txt | uniq -u
one-time-item
範例 4:找出有重複的行

使用 -d 只顯示有重複的行(重複次數 ≥ 2 的行,每個只顯示一次)。

$ sort usernames.txt | uniq -d
admin
alice

常見錯誤與排錯

uniq 沒有刪掉所有重複行
原因
uniq 只過濾「相鄰」的重複行,不相鄰的重複行不會被刪除。
解法
先用 sort 排序再接 uniq:sort file.txt | uniq(或 sort -u file.txt)。

延伸閱讀