Linux COMM命令
1. 概述
有时我们需要比较两个文件的内容。也许我们有两个重复的文件,我们需要在删除一个之前确保它们包含相同的数据。
在本教程中,我们将探索comm 命令。该工具允许我们比较两个文件,而无需逐行滚动。
2. 什么是comm?
comm命令需要两个文件名,然后进行比较,并根据数据的唯一性返回三列。第一列是file1 中的唯一值,第二列是file2中的唯一值,第三列是两个文件中相同的值。
diff命令与我们可以用来比较文件的命令类似但更复杂。使用comm,输出更简单,功能更易于使用。comm的简单性使它更适合在脚本中使用。
在我们运行 comm命令之前,我们必须确保文件的内容都已排序。否则,它将返回错误并且不会显示正确的输出。我们将在本教程后面介绍对数据进行排序的方法。
3. 输入输出
如果我们不需要格式化文件,那么我们可以运行comm命令,后跟我们要比较的两个文件名:
$ comm file1 file2
3.1. 测试文件
让我们创建这两个文件(file1和file2),以便我们可以使用comm命令比较两者的内容:
$ cat <<EOF> file1
> Cat
> Dog
> Pony
> fish
> EOF
$ cat <<EOF> file2
> fish
> dog
> hamster
> Pig
> EOF
这些命令故意不按字母顺序创建file1和file2,以便我们稍后可以了解如何对这些值进行排序。
3.2. 排序文件
我们必须使用相同的排序标准对文件进行排序,comm 命令才能正常工作。
如果我们正确地对两个文件进行了排序,该命令将按预期运行,没有错误。但是,如果我们不对文件进行排序,我们将在第一个未排序值的结果中得到错误,说明文件 N 未排序。
将输出文件的剩余内容,但不会按预期比较剩余内容:
$ comm file1 file2
Cat
Dog
fish
comm: file 2 is not in sorted order
dog
hamster
Pig
Pony
comm: file 1 is not in sorted order
fish
如果文件尚未排序,我们可以使用sort 命令来帮助我们。
知道 sort 输出一个排序值列表,我们可以使用*<()语法将两个排序*命令的输出替换为我们的两个文件。
然后comm命令将运行排序列表而不是未排序列表的比较:
$ comm <(sort file1) <(sort file2)
Cat
dog
Dog
fish
hamster
Pig
Pony
3.3. 指定要隐藏的比较
我们可以指定不想在输出中显示的列。为此,我们需要在要隐藏的列之后添加一个减号 (-)。
例如,如果我们只想显示第 3 列(“两者”列),我们可以说隐藏第 1 列和第 2 列:
$ comm -12 <(sort file1) <(sort file2)
fish
我们现在可以清楚地看到两个文件共享的唯一条目是“fish”。
3.4. 忽略大小写敏感性
查看前面的示例,我们已经看到两个文件都返回单词“dog”,因为它们在每个文件中都是唯一的。
comm命令区分大小写。 如果两个值不完全相同,它将在两个文件列中显示为唯一值。
如果两个文件之间存在大小写差异,我们可以在comm命令中使用tr命令内联将两者都转换为小写:
$ comm <(sort <(tr '[:upper:]' '[:lower:]' < file1)) <(sort <(tr '[:upper:]' '[:lower:]' < file2))
cat
dog
fish
hamster
pig
pony