Linux 求文件交集 差集等


使用comm命令

假設兩個文件FILE1和FILE2用集合A和B表示,FILE1內容如下:

a
b
c
e
d
a  

FILE2內容如下:

c
d
a
c

基本上有兩個方法,一個是comm命令,一個是grep命令。分別介紹如下:

 

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。

直接運行結果如下:

$ 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 

排序並且唯一

$ 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   顯示版本信息。


  comm命令比較兩個已排序文件每行數據的差異,並將其結果顯示出來,如果沒有指定任何參數,comm命令讀取這兩個文件,然后生成三列輸出:1>僅在file1中出現的行2>僅在file2中出現的行3>在兩個文件中都存在的行。
  如果為文件名之一指定 -(減號),則 comm 命令會從標准輸入設備讀取數據。

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是字符數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM