iT邦幫忙

DAY 10
1

蠻可愛的指令與程式系列 第 10

獨一無二

在我們處理資料的時候,時常有去除重複只保留一個的需求.
在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,以及數量.


上一篇
記得打開喇叭
下一篇
建立只發送Mail的Mail Server
系列文
蠻可愛的指令與程式30

尚未有邦友留言

立即登入留言