天天看點

[Shell]comm 交集 差集

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/51614572

1. 簡介

comm指令可以用于兩個檔案之間的比較,它有一些選項可以用來調整輸出,以便執行交集、求差、以及差集操作。 

  • 交集:列印出兩個檔案所共有的行。 
  • 求差:列印出指定檔案所包含的且不相同的行。 
  • 差集:列印出包含在一個檔案中,但不包含在其他指定檔案中的行。
2. 文法
  1. comm (選項) (參數)

3. 選項
  • -1:不顯示在第一個檔案出現的内容 
  • -2:不顯示在第二個檔案中出現的内容 
  • -3:不顯示同時在兩個檔案中都出現的内容
4. 參數
  • 檔案1:指定要比較的第一個有序檔案
  • 檔案2:指定要比較的第二個有序檔案
5. 執行個體
  1. xiaosi@Qunar:~/company/sh$ cat a.txt

  2. a

  3. b

  4. d

  5. e

  6. f

  7. g

  8. h

  9. l

  10. v

  1. xiaosi@Qunar:~/company/sh$ cat b.txt

  2. b

  3. d

  4. g

  5. l

  6. n

  7. r

  8. t

  9. y

(1)無選項:輸出的第一列隻包含在a.txt中出現的行,第二列包含在b.txt中出現的行,第三列同時包含在a.txt和b.txt中的行。各列是以制表符(\t)作為定界符。

  1. xiaosi@Qunar:~/company/sh$ comm a.txt b.txt

  2. a

  3.                          b

  4.                          d

  5. e

  6. f

  7.                          g

  8. h

  9.                          l

  10.            n

  11.            r

  12.            t

  13. v

  14.            y

(2)-1選項(可以了解為-1删除第一列,-2删除第二列):不顯示隻在第一個檔案出現的内容,輸出的第一列隻包含在b.txt中出現的行,第二列同時包含在a.txt和b.txt中的行

  1. xiaosi@Qunar:~/company/sh$ comm -1 a.txt b.txt

  2.            b

  3.            d

  4.            g

  5.            l

  6. n

  7. r

  8. t

  9. y

(3)交集:第三列就是交集的内容,隻需删除第一列和第二列内容即可

  1. xiaosi@Qunar:~/company/sh$ comm -1 -2 a.txt b.txt

  2. b

  3. d

  4. g

  5. l

(4)求差:列印出兩個檔案中不相同的行,需要删除第三列,sed 's/^\t//' 是将制表符(\t)删除,以便把兩列合并成一列。

  1. xiaosi@Qunar:~/company/sh$ comm -3 a.txt b.txt

  2. a

  3. e

  4. f

  5. h

  6.           n

  7.           r

  8.           t

  9. v

  10.           y

  11. xiaosi@Qunar:~/company/sh$ comm -3 a.txt b.txt | sed 's/^\t//'

  12. a

  13. e

  14. f

  15. h

  16. n

  17. r

  18. t

  19. v

  20. y

(5)差集

a.txt的差集

  1. xiaosi@Qunar:~/company/sh$ comm a.txt b.txt -2 -3

  2. a

  3. e

  4. f

  5. h

  6. v

b.txt差集

  1. xiaosi@Qunar:~/company/sh$ comm a.txt b.txt -1 -3

  2. n

  3. r

  4. t

  5. y