0%

comm命令

一、常用用法

comm FILE1 FILE2

二、含义与选项

2.1、含义

对于两个已排序的文件,逐行比对。
打印结果有3列:第1列,只属于“FILE1”的行;第2列,只属于“FILE2”的行;第3列,既属于“FILE1”,又属于“FILE2”的行。

2.2、选项表示的意思

“FILE1,FILE2”:指代已排序文件“FILE1”和“FILE2”

三、其他

3.1、“LC_COLLATE”等环境变量

由于涉及到两个字符串的比较等,故而程序实现中使用“LC_COLLATE”等环境变量,最终结果受到“LC_COLLATE”等环境变量的控制。

3.2、排序策略

comm命令实现设定的排序策略是“按照字典序排序”。两个已排序文件使用的排序策略组合共有3种情况。

3.2.1、情况1

一个排序文件按照字典序排序,另外一个排序文件按照非字典序(其他排序策略)排序。显而易见,在这种情况下,comm命令的执行结果会比较奇怪。

3.2.2、情况2

两个排序文件都按照同一个排序策略(非字典序)排序,这种情况下,comm命令的执行结果还是不能达到我们的预期。
接下来通过例子说明,有文件“c.txt”和“d.txt”,内容分别如下所示:

001
02
3
10
001
02
5
06
007
10

即已按照“数值大小”排序,执行“逐行比对”过程,我们的预期结果是:“3”只属于“c.txt”,“5,06,007”只属于“d.txt”,“001,02,10”共属于两个文件。

现在执行comm c.txt d.txt命令,得到如图1所示结果,不能达到预期。

图1

执行comm --nocheck-order c.txt d.txt命令,得到如图2所示结果,也不能达到预期。

图2

3.2.3、情况3

两个文件都已按照字典序排序,这符合comm命令实现的设定,comm命令的执行结果能够达到预期。执行下述命令,得到如图3所示结果,结果符合预期。

sort c.txt > cc.txt
sort d.txt > dd.txt
comm cc.txt dd.txt

图3


参考文献

[1]man comm

您的支持将鼓励我继续分享!