1. 程式人生 > 其它 >使用uniq命令求並集交集差集

使用uniq命令求並集交集差集

原創:打碼日記(微信公眾號ID:codelogs),歡迎分享,轉載請保留出處。

uniq

uniq是linux上非常有用的一個命令,從字面意思上就能看出來,它可以用來去重。 
但使用uniq的前提是檔案是排好序的,所以我們經常會搭配sort排序命令來一起使用uniq,如下:

$ cat test.txt
c 
a 
a
b 

$ sort test.txt | uniq
a
b
c

# sort -u 也能去重
$ sort -u test.txt
a
b
c

如上所示,由於sort -u也能達到去重的效果,導致uniq的原本功能就顯得不那麼有用了。 
其實經常會發現這樣的linux命令,衍生功能比原始功能更有用,比如wc

命令,全名是word count,即單詞計數,但我們最常用的卻是wc -l獲取行數。 
wc一樣,uniq的衍生功能也比原始去重功能要有用得多,如下:

分組計數uniq -c

$ sort test.txt | uniq -c
      2 a
      1 b
      1 c

-c選項可以統計每個值的個數,超級有用,還有下面這個按狀態統計TCP連線數的。

$ netstat -nat|awk '/tcp/{print $NF}'|sort|uniq -c
      4 CLOSE_WAIT
      6 ESTABLISHED
      2 LAST_ACK
      2 LISTEN

求並集

$ cat test1.txt
c 
a 
b 

$ cat test2.txt
c
b
d

$ cat test1.txt test2.txt |sort |uniq 
a
b
c
d 

很顯然,兩個檔案合併後,再去重,就是並集了。

求交集

$ cat test1.txt test2.txt | sort | uniq -d
b
c

-d選項的作用是隻輸出有重複的項,顯然,兩個檔案合併,重複項就是交集。

求差集

$ cat test1.txt test2.txt test2.txt| sort | uniq -u 
a

-u選項的作用是隻輸出唯一的項,顯然,如果test2.txt

中的項在text1.txt中也存在,這一項就不會輸出,另外,為了讓test2.txt的內容不輸出,故意讓其cat了兩次。

comm

comm命令可以更直觀的求並集,交集與差集,同樣,交給comm處理的資料,也要事先排好序,如下:

$ comm <(sort -u test1.txt) <(sort -u test2.txt)
a
                b
                c
        d

<()是bash下的命令替換語法,它類似於生成一個臨時虛擬檔案,且檔案內容就是命令的輸出內容。
如上,第一列是test1.txttest2.txt的差集,第二列是test2.txttest1.txt的差集,第三列就是交集。 
如果只想要交集,可使用comm -1 -2comm -12-1 -2表示不顯示第一列與第二列,同理-3就是不顯示第三列。 
啥,你說它沒有並集?看下面,用tr把空白刪掉就好了嘛!

$ comm <(sort -u test1.txt) <(sort -u test2.txt)|tr -d '\t'
a
b
c
d

往期內容

mysql的timestamp會存在時區問題?
hex,base64,urlencode編碼方案對比
字元編碼解惑
真正理解可重複讀事務隔離級別
Linux文字命令技巧(下)
Linux文字命令技巧(上)