在我們處理資料的時候,時常有去除重複只保留一個的需求.
在SQL Command中,有DISTINCT,可以達到此一功能.
在UNIX的指令中, uniq 除了提供此一功能外,還附加了
只保留重複的,或是只保留獨一無二的.也提供了計數,
另外還附加了skip chars與skip-field的功能.
來看看實例吧.
檔案內容:
rbd-567 二宮沙樹
miad-575 椎名ゆな
bbi-171 桜木凛
bbi-168 桜木凛
pgd-311 桜木凛
pppd-102 Julia
mdyd-695 Julia
接著使用 uniq -1 -c p1010.txt
這是跳掉第一個欄位,使用第二個欄位做依據來處理.
會得到以下結果:
1 rbd-567 二宮沙樹
1 miad-575 椎名ゆな
3 bbi-171 桜木凛
2 pppd-102 Julia
前面的數字為uniq幫我們計數.
接著用 uniq -1 -c -u p1010.txt
得到
1 rbd-567 二宮沙樹
1 miad-575 椎名ゆな
這就是保留只有一項的.
再來用 uniq -1 -c -d p1010.txt
得到
3 bbi-171 桜木凛
2 pppd-102 Julia
這就是保留有重複的.
實務上我們會搭配其他程式例如awk,來過濾掉不需要的欄位,
或是用另一個說法,保留需要的欄位.
例如:
cat p1010.txt | awk '{print $2}' | uniq -c
1 二宮沙樹
1 椎名ゆな
3 桜木凛
2 Julia
一般還會再附加使用sort
升冪
cat p1010.txt | awk '{print $2}' | uniq -c | sort -n
1 二宮沙樹
1 椎名ゆな
2 Julia
3 桜木凛
降冪
cat p1010.txt | awk '{print $2}' | uniq -c | sort -nr
3 桜木凛
2 Julia
1 椎名ゆな
1 二宮沙樹
除了對檔案內容進行處理外,uniq 時常扮演其他指令輸出結果的過濾器.
例如
ps hax -o user | sort | uniq -c
10 apache
60 asami
2 avahi
1 dbus
1 gdm
2 haldaemon
1 mysql
1 neo4j
1 ntp
7 postgres
141 root
1 rpc
1 rpcuser
1 rtkit
1 zookeeper
這樣就很方便查看系統中processes是屬於哪些user,以及數量.