本篇是 Linux 的 uniq 指令的使用教學,以及各種範例程式碼。

在 Linux 系統中有許多的可以用來處理文字資料的指令工具,不同的狀況可以使用不同的工具來處理,其中 uniq 是一個可以將重複文字刪除的小工具,留下不重複的資料。


以下是 uniq 這個工具的使用方式,以及各種實用的範例。

刪除重複行

假設我們有一個文字檔 example1.txt,其內容如下:

G. T. Wang
G. T. Wang
Hello, world.
Hello, world.
Hello, world.
This is a test.

使用 uniqexample1.txt 中連續重複的文字行去掉:

uniq example1.txt

每一段重複的文字行不管重複幾次,處理完之後只會留下一行不重複的文字行:

G. T. Wang
Hello, world.
This is a test.

計算文字行重複次數

uniq 若加上 -c 參數,可以在刪除重複文字行之後,標示出每一行的重複次數:

uniq -c example1.txt
      2 G. T. Wang
      3 Hello, world.
      1 This is a test.

只輸出重複文字行

若只要輸出有重複的文字行,可以加上 -D 參數:

uniq -D example1.txt
G. T. Wang
G. T. Wang
Hello, world.
Hello, world.
Hello, world.

而若要將這個輸出中重複的行刪掉,可以改用 -d 參數:

uniq -d example1.txt
G. T. Wang
Hello, world.

如果想要把重複的文字行拿來交給其他的程式進行處理,可以使用空白行區分每段重複的文字區塊:

uniq --all-repeated=separate example.txt
G. T. Wang
G. T. Wang

Hello, world.
Hello, world.
Hello, world.

或是在每一段重複的文字區塊前加上一行空白行:

uniq --all-repeated=prepend example.txt
 
G. T. Wang
G. T. Wang

Hello, world.
Hello, world.
Hello, world.

只輸出沒有重複的文字行

如果只想要輸出沒有重複的文字行,也就是說只要出現重複的文字行,就完全刪掉,可以使用 -u 參數:

uniq -u example1.txt
This is a test.

跳過開頭欄位

假設文字檔 example2.txt 的內容如下,這個文字檔有兩個欄位,不同欄位之間以空白(或 tab)分隔:

A1 Hello
A2 Hello
A3 Hello
A4 World
A5 World

如果我們想要讓 uniq 在檢查重複文字行的時候,跳過開頭特定幾個欄位的資料,可以使用 -f 參數來指定要跳過的欄位數:

uniq -f 1 example2.txt

這樣 uniq 就會跳過第 1 欄,從第二欄開始檢查,輸出為:

A1 Hello
A4 World

跳過開頭幾個字元

假設文字檔 example3.txt 的內容如下:

A01/Hello
A02/Hello
A03/Hello
A04/World
A05/World

如果希望 uniq 在處理文字時,跳過每一行的前幾個字元,可以使用 -s 參數。

uniq -s 4 example3.txt

這樣就會跳果每一行的前 4 個字元,從第五個字元開始比較:

A01/Hello
A04/World

只比較開頭幾個字元

假設文字檔 example4.txt 的內容如下:

Hello, world.
Hello, WORLD.
Hi, world.
Hi, WORLD.

如果希望 uniq 在處理文字時,只比較每一行的前幾個字元,不考慮之後的文字,可以使用 -w 參數。

uniq -w 5 example4.txt

這樣就會只使用每一行的前 5 個字元來做比較:

Hello, world.
Hi, world.
Hi, WORLD.

不分英文大小寫

若要讓 uniq 在比較文字時,將大寫與小寫的英文字母是為相同,可加上 -i 參數:

uniq -i example4.txt
Hello, world.
Hi, world.

參考資料:HowtoForge