Contents

Linux COMM命令

1. 概述

有时我们需要比较两个文件的内容。也许我们有两个重复的文件,我们需要在删除一个之前确保它们包含相同的数据。

在本教程中,我们将探索comm 命令。该工具允许我们比较两个文件,而无需逐行滚动。

2. 什么是comm

comm命令需要两个文件名,然后进行比较,并根据数据的唯一性返回三列。第一列是file1 中的唯一值,第二列是file2中的唯一值,第三列是两个文件中相同的值。

diff命令与我们可以用来比较文件的命令类似但更复杂。使用comm,输出更简单,功能更易于使用。comm的简单性使它更适合在脚本中使用。

在我们运行 comm命令之前,我们必须确保文件的内容都已排序。否则,它将返回错误并且不会显示正确的输出。我们将在本教程后面介绍对数据进行排序的方法。

3. 输入输出

如果我们不需要格式化文件,那么我们可以运行comm命令,后跟我们要比较的两个文件名:

$ comm file1 file2

3.1. 测试文件

让我们创建这两个文件(file1file2),以便我们可以使用comm命令比较两者的内容:

$ cat <<EOF> file1
> Cat
> Dog
> Pony
> fish
> EOF
$ cat <<EOF> file2
> fish
> dog
> hamster
> Pig
> EOF

这些命令故意不按字母顺序创建file1file2,以便我们稍后可以了解如何对这些值进行排序。

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