本篇是 Linux 的 uniq
指令的使用教學,以及各種範例程式碼。
在 Linux 系統中有許多的可以用來處理文字資料的指令工具,不同的狀況可以使用不同的工具來處理,其中 uniq
是一個可以將重複文字刪除的小工具,留下不重複的資料。
以下是
uniq
這個工具的使用方式,以及各種實用的範例。
刪除重複行
假設我們有一個文字檔 example1.txt
,其內容如下:
G. T. Wang G. T. Wang Hello, world. Hello, world. Hello, world. This is a test.
使用 uniq
將 example1.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