comm
,又称为_compare common lines_命令,是一个简易的Linux文件比较工具,主要用于标识出两个已排序文件中的共同部分。该命令逐行比较两个文件,并以三列形式显示结果。
通常,comm
命令在所有的Linux发行版上都是可用的,这包括但不限于Ubuntu、Debian、CentOS,以及Fedora等。在您的系统上不可用时,一般是由于coreutils
包尚未安装造成的。在大多数系统上,可以用下面的命令来安装:
在CentOS 7上:
[linux@bashcommandnotfound.cn ~]$ sudo yum install coreutils
在CentOS 8及其它最新的Linux发行版上:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install coreutils
不同的Linux命令及其参数应以选项卡形式展示,这将有助于读者更好地理解和比较。
comm [OPTION]... FILE1 FILE2
在这里,FILE1和FILE2是你要比较的两个文件。
选项 | 描述 |
---|---|
-1 | 不输出文件1独有的行 |
-2 | 不输出文件2独有的行 |
-3 | 只输出两文件共有的行 |
[linux@bashcommandnotfound.cn ~]$ comm -12 file1 file2
这里的数字选项可以组合使用,例如-12
会同时启用-1
和-2
。
[linux@bashcommandnotfound.cn ~]$ comm --check-order file1 file2
[linux@bashcommandnotfound.cn ~]$ comm -3 file1 file2
[linux@bashcommandnotfound.cn ~]$ comm -23 file1 file2
[linux@bashcommandnotfound.cn ~]$ comm -13 file1 file2
[linux@bashcommandnotfound.cn ~]$ comm -3 file1 file2
上述命令用于返回那些只在一个文件中存在的行,而另一个文件不存在,即文件1和文件2独有的行。
[linux@bashcommandnotfound.cn ~]$ comm --nocheck-order file1 file2
这个例子中,不论文件是否排序,comm
命令会直接执行并给出结果,可能会包含错误。
[linux@bashcommandnotfound.cn ~]$ awk 'BEGIN {
print "Comm Command in Scripts";
print "File1 Contents : ";
system("cat file1");
print "File2 Contents : ";
system("cat file2");
print "Comm Output : "
system("comm file1 file2");
}'
在这个例子中,我们将comm命令结合了awk命令一起使用在一个脚本中,比较了两个文件的内容。
[linux@bashcommandnotfound.cn ~]$ comm -12 <(ls dir1) <(ls dir2)
这个例子中,我们用了进程替换的方式,将ls命令的输出作为comm命令的输入,显示了dir1和dir2都有的文件。
[linux@bashcommandnotfound.cn ~]$ comm -13 <(sort file1.csv) <(sort file2.csv)
对比两个CSV文件中独有的行,-1
和-3
选项一同使用表示只输出file2中独有的行,这在数据处理中也是十分常用的。
[linux@bashcommandnotfound.cn ~]$ comm -12 <(sort text1.txt) <(sort text2.txt) > common.txt
这个例子中,我们将两个文本文件排序后的共有的行输出到了一个新的文本文件common.txt中。
[linux@bashcommandnotfound.cn ~]$ comm --check-order sorted_file1 sorted_file2
在这个例子中,comm
会检查输入文件是否已经排序。如果文件已经排序,comm
命令将正常执行。如果输入文件没有排序,comm
命令将返回一个错误。
comm
命令的结果可能不准确。