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
# 删除第一列和第三列