3.3 文本文件的交集与差集

《Linux Shell 脚本攻略(第 2 版)》读书笔记

comm 命令可用于两个文件之间的比较。可执行如下操作

  • 交集(intersection):打印出两个文件所共有的行。
  • 求差(difference):打印出指定文件所包含的且互不相同的那些行。
  • 差集(set difference):打印出包含在文件 A 中,但不包含在其他指定文件中的那些行。

注意comm必须使用排过序的文件作为输入。

现有 A.txt、B.txt 两个文件

$ sort A.txt -o A.txt ; sort B.txt -o B.txt # 排序
$ cat A.txt
apple
gold
iron
orange
silver
steel
$ cat B.txt
carrot
cookies
gold
orange

执行不带任何选项的 comm 命令

$ comm A.txt B.txt
apple
        carrot
        cookies
                gold
iron
                orange
silver
steel
  • 第一列,包含只在 A.txt 文件中出现的行。
  • 第二列,包含只在 B.txt 文件中出现的行。
  • 第三列,包含 A.txt 和 B.txt 中相同的行。
  • 各列以制表符(\t)作为定界符。

打印两个文件的交集

$ comm -1 -2 A.txt B.txt
gold
orange
  • -1 删除第一列
  • -2 删除第二列

打印两个文件中不相同的行(求差)

$ comm -3 A.txt B.txt
apple
        carrot
        cookies
iron
silver
steel

# 生成规范的输出
$ comm -3 A.txt B.txt | sed 's/^\t//'
apple
carrot
cookies
iron
silver
steel

# OS X 用下面这个命令
$ comm -3 A.txt B.txt | tr "\t" "\0"

sed 's/^\t//':sed 是一个“非交互式的”面向字符流的编辑器。

  • s 表示替换(substitute)。
  • /^\t/ 匹配行前的\t^是行首标记)。
  • // 用来替换行首的\t

差集

  • A.txt 的差集
$ comm -2 -3 A.txt B.txt
# 删除第二列和第三列
  • B.txt 的差集
$ comm -1 -3 A.txt B.txt
# 删除第一列和第三列

你可能感兴趣的:(3.3 文本文件的交集与差集)