使用uniq命令求並集交集差集
阿新 • • 發佈:2022-03-26
原創:打碼日記(微信公眾號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
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.txt
減test2.txt
的差集,第二列是test2.txt
減test1.txt
的差集,第三列就是交集。
如果只想要交集,可使用comm -1 -2
或comm -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文字命令技巧(上)