Linux 求文件交集 差集等

使用comm命令

假設兩個文件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命令:

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。注意順序很重要! 

cat+sort+uniq

1. 取出兩個文件的並集(重複的行只保留一份)

    cat file1 file2 | sort | uniq

2. 取出兩個文件的交集(只留下同時存在於兩個文件中的文件)

    cat file1 file2 | sort | uniq -d

 3. 刪除交集,留下其餘的行

    cat file1 file2 | sort | uniq -u

 

    若是須要計數也有一個很好的參數uniq -c 能夠將相同行數的計數放在行首

 sort排序

    是根據從輸入行抽取的一個或多個關鍵字進行比較來完成的。排序關鍵字定義了用來排序的最小的字符序列。缺省狀況下以整行爲關鍵字按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做爲字段分隔符。

    uniq命令

    文件通過處理後在它的輸出文件中可能會出現重複的行。例如,使用cat命令將兩個文件合併後,再使用sort命令進行排序,就可能出現重複行。這時可使用uniq命令將這些重複行從輸出文件中刪除,只留下每條記錄的惟同樣本。

    語法:

    uniq [選項] 文件

    說明:這個命令讀取輸入文件,並比較相鄰的行。在正常狀況下,第二個及之後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不一樣。若是輸入文件用「- 」表示,則從標準輸入讀取。

    該命令各選項含義以下:

    - c 顯示輸出中,在每行行首加上本行在文件中出現的次數。它可取代- u和- d選項。

    - d 只顯示重複行。

    - u 只顯示文件中不重複的各行。

    - n 前n個字段與每一個字段前的空白一塊兒被忽略。一個字段是一個非空格、非製表符的字符串,彼此由製表符和空格隔開(字段從0開始編號)。

    +n 前n個字符被忽略,以前的字符被跳過(字符從0開始編號)。

    - f n 與- n相同,這裏n是字段數。

    - s n 與+n相同,這裏n是字符數。

相關文章
相關標籤/搜索