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)。