侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux comm命令教程(用法详解):如何比较两个已排序文件的差异和相同之处

Linux comm命令介绍

comm命令是compare two sorted files的缩写,它可以一行行地比较两个已排序的文件,并将结果分成三列显示。第一列是只在第一个文件中出现的行,第二列是只在第二个文件中出现的行,第三列是在两个文件中都出现的行。comm命令可以用于查找文件之间的差异和相同之处,也可以用于过滤或合并文件内容。

适用的Linux版本

comm命令是一个标准的Linux工具,它适用于大多数的Linux发行版,如Ubuntu, Debian, CentOS, Fedora等。如果你的系统没有安装comm命令,你可以使用以下命令来安装它:

  • 对于基于Debian的系统,如Ubuntu,你可以使用apt-get命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install coreutils
  • 对于基于Red Hat的系统,如CentOS,你可以使用yum或dnf命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo yum install coreutils

或者

[linux@bashcommandnotfound.cn ~]$ sudo dnf install coreutils

Linux comm命令的基本语法

comm命令的基本语法如下:

comm [选项] 文件1 文件2

其中,文件1和文件2是要比较的两个已排序文件的名称。如果文件名为-,则表示从标准输入读取数据。选项可以用来控制输出的格式和内容。

Linux comm命令的常用选项说明

comm命令有以下几个常用的选项:

选项说明
-1不显示只在文件1中出现的行
-2不显示只在文件2中出现的行
-3不显示在两个文件中都出现的行
--check-order检查文件是否已排序,如果没有,则报错
--nocheck-order不检查文件是否已排序
--output-delimiter=字符用指定的字符代替默认的空格作为输出列之间的分隔符
--total显示每一列中行数的总和
-z用空字符而不是换行符作为输出行的结束符

Linux comm命令的实例

以下是一些使用comm命令的实例:

比较两个文件并显示三列输出

假设有两个文件file1.txt和file2.txt,它们的内容如下:

file1.txt:

apple
banana
cherry
date
grape

file2.txt:

banana
cherry
date
kiwi
orange

我们可以使用comm命令来比较这两个文件,并显示三列输出:

[linux@bashcommandnotfound.cn ~]$ comm file1.txt file2.txt 
apple
	banana
	cherry
	date
grape
	kiwi
	orange

输出中,第一列是只在file1.txt中出现的行(apple和grape),第二列是只在file2.txt中出现的行(kiwi和orange),第三列是在两个文件中都出现的行(banana, cherry和date)。

比较两个文件并只显示相同的行

如果我们只想看两个文件中相同的行,我们可以使用-12选项来隐藏前两列:

[linux@bashcommandnotfound.cn ~]$ comm -12 file1.txt file2.txt 
banana
cherry
date

输出中,只有一列,即在两个文件中都出现的行。

比较两个文件并只显示不同的行

如果我们只想看两个文件中不同的行,我们可以使用-3选项来隐藏第三列:

[linux@bashcommandnotfound.cn ~]$ comm -3 file1.txt file2.txt 
apple
grape
	kiwi
	orange

输出中,有两列,第一列是只在file1.txt中出现的行,第二列是只在file2.txt中出现的行。

比较两个文件并使用制表符作为分隔符

如果我们想用制表符而不是空格来分隔输出的列,我们可以使用--output-delimiter选项,并指定分隔符为\t:

[linux@bashcommandnotfound.cn ~]$ comm --output-delimiter='\t' file1.txt file2.txt 
apple	banana	banana
	cherry	cherry
	date	date
grape	kiwi	
	orange

输出中,每一列之间用一个制表符分隔。

比较两个文件并显示每一列的总行数

如果我们想看每一列中有多少行,我们可以使用--total选项来显示总和:

[linux@bashcommandnotfound.cn ~]$ comm --total file1.txt file2.txt 
apple
	banana
	cherry
	date
grape
	kiwi
	orange
2	2	3

输出中,最后一行显示了每一列的总行数。第一列有2行,第二列有2行,第三列有3行。

Linux comm命令的注意事项

  • comm命令要求输入的文件必须已经按照字典顺序排序。如果文件没有排序,comm命令可能会产生错误或不完整的结果。如果你不确定文件是否已排序,你可以使用--check-order选项来检查。如果文件没有排序,comm命令会报错并退出。
  • 如果你想比较两个未排序的文件,你可以使用sort命令来对文件进行排序,并将结果传递给comm命令。例如:
[linux@bashcommandnotfound.cn ~]$ comm <(sort file1.txt) <(sort file2.txt)

这个命令使用了进程替换的语法,它会将sort命令的输出作为临时文件传递给comm命令。

  • comm命令默认会忽略大小写的差异。如果你想区分大小写,你可以使用sort命令的-f选项来忽略大小写,并将结果传递给comm命令。例如:
[linux@bashcommandnotfound.cn ~]$ comm <(sort -f file1.txt) <(sort -f file2.txt)

这个命令会将file1.txt和file2.txt中的大写字母转换为小写字母,并按照字典顺序排序,然后传递给comm命令。

0

评论区