假設兩個文件FILE1和FILE2用集合A和B表示,FILE1內容以下:html
a b c e d a
FILE2內容以下:spa
c d a c
基本上有兩個方法,一個是comm命令,一個是grep命令。分別介紹以下:code
comm命令 , Compare sorted files FILE1 and FILE2 line by line. With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files. 要注意兩個文件必須是排序和惟一(sorted and unique)的,默認輸出爲三列,第一列爲是A-B,第二列B-A,第三列爲A交B。htm
直接運行結果以下:blog
$ comm a.txt b.txt
a
b
c
d
a
c
e
d
a
僅僅排序:排序
$ comm <(sort a.txt ) <(sort b.txt ) a a b c c d e
排序而且惟一:three
$ comm <(sort a.txt|uniq ) <(sort b.txt|uniq ) a b c d e
若是隻想要交集,以下便可:字符串
$ comm -12 <(sort a.txt|uniq ) <(sort b.txt|uniq ) a c d
comm命令參數:
-1 不顯示只在第1個文件裏出現過的列。
-2 不顯示只在第2個文件裏出現過的列。
-3 不顯示只在第1和第2個文件裏出現過的列。
--help 在線幫助。
--version 顯示版本信息。it
comm命令比較兩個已排序文件每行數據的差別,並將其結果顯示出來,若是沒有指定任何參數,comm命令讀取這兩個文件,而後生成三列輸出:1>僅在file1中出現的行2>僅在file2中出現的行3>在兩個文件中都存在的行。
若是爲文件名之一指定 -(減號),則 comm 命令會從標準輸入設備讀取數據。io
grep 命令是經常使用的搜索文本內容的,要找交集,以下便可:
p$ grep -F -f a.txt b.txt c d a c
grep不要求排序,可是由於是集合操做,惟一是必須的(否則怎麼是集合呢?)。因此:
$ grep -F -f a.txt b.txt | sort | uniq a c d
差集:
$ grep -F -v -f a.txt b.txt | sort | uniq $ grep -F -v -f b.txt a.txt | sort | uniq b e
第一行結果爲B-A,因此爲空;第二行爲A-B。注意順序很重要!
1. 取出兩個文件的並集(重複的行只保留一份)
cat file1 file2 | sort | uniq
2. 取出兩個文件的交集(只留下同時存在於兩個文件中的文件)
cat file1 file2 | sort | uniq -d
3. 刪除交集,留下其餘的行
cat file1 file2 | sort | uniq -u
若是須要計數也有一個很好的參數uniq -c 能夠將相同行數的計數放在行首
是根據從輸入行抽取的一個或多個關鍵字進行比較來完成的。排序關鍵字定義了用來排序的最小的字符序列。缺省狀況下以整行爲關鍵字按ASCII字符順序進行排序。
改變缺省設置的選項主要有:
- m 若給定文件已排好序,合併文件。
- c 檢查給定文件是否已排好序,若是它們沒有都排好序,則打印一個出錯信息,並以狀態值1退出。
- u 對排序後認爲相同的行只留其中一行。
- o 輸出文件 將排序輸出寫到輸出文件中而不是標準輸出,若是輸出文件是輸入文件之一,sort先將該文件的內容寫入一個臨時文件,而後再排序和寫輸出結果。
改變缺省排序規則的選項主要有:
- d 按字典順序排序,比較時僅字母、數字、空格和製表符有意義。
- f 將小寫字母與大寫字母同等對待。
- I 忽略非打印字符。
- M 做爲月份比較:「JAN」<「FEB」
- r 按逆序輸出排序結果。
-k, -key=POS1[,POS2] posl - pos2 指定一個或幾個字段做爲排序關鍵字,字段位置從posl開始,到pos2爲止(包括posl,不包括pos2)。如不指定pos2,則關鍵字爲從posl到行尾。字段和字符的位置從0開始。
- b 在每行中尋找排序關鍵字時忽略前導的空白(空格和製表符)。
- t separator 指定字符separator做爲字段分隔符。
文件通過處理後在它的輸出文件中可能會出現重複的行。例如,使用cat命令將兩個文件合併後,再使用sort命令進行排序,就可能出現重複行。這時可使用uniq命令將這些重複行從輸出文件中刪除,只留下每條記錄的惟同樣本。
語法:
uniq [選項] 文件
說明:這個命令讀取輸入文件,並比較相鄰的行。在正常狀況下,第二個及之後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不一樣。若是輸入文件用「- 」表示,則從標準輸入讀取。
該命令各選項含義以下:
- c 顯示輸出中,在每行行首加上本行在文件中出現的次數。它可取代- u和- d選項。
- d 只顯示重複行。
- u 只顯示文件中不重複的各行。
- n 前n個字段與每一個字段前的空白一塊兒被忽略。一個字段是一個非空格、非製表符的字符串,彼此由製表符和空格隔開(字段從0開始編號)。
+n 前n個字符被忽略,以前的字符被跳過(字符從0開始編號)。
- f n 與- n相同,這裏n是字段數。
- s n 與+n相同,這裏n是字符數。