comm -23 不删除所有公共行

comm -23 not deleting all common lines

我想从文件 1.txt 中删除文件 2.txt 中的行并将输出保存到 3.txt, 我正在使用这个 bash 命令:

comm -23 1.txt 2.txt > 3.txt

当我检查文件3.txt中的输出时,我发现1.txt和2.txt之间的一些公共行仍然在3.txt中,以单词 "registry" ,有什么问题?

您可以下载以下两个文件:

文件 1.txt : https://ufile.io/n7vn6

文件 2.txt : https://ufile.io/p4s58

comm 需要对输入进行排序。您可以为此使用 process substitution

comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt

更新,如果你还有行尾问题,你可以使用sed来对齐:

comm -23 <(sed 's/\r//g' 1.txt | sort) <(sed 's/\r//g' 2.txt| sort) > 3.txt

我不确定您是如何生成文本文件的,但问题是您的某些 1.txt2.txt 行没有一致的行终止符。有些有一个 CR 字符 (ctrl-M) 但不是唯一的换行符 Linux 期望文本文件。例如,其中一个 registry^Mregistry 不匹配(Linux 检查文本的程序会将 ^M 视为另一个字符或白色 space 但而不是作为被忽略的行终止)。当您使用某些文本编辑器查看该文件时,^M 不可见,因此看起来 registry 在两个地方都相同,但事实并非如此。

你可以试试:

dos2unix 1.txt 2.txt
comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt

dos2unix 将使所有行终止正确(假设它们可能正在使用 DOS CR)。请注意,这可能会稍微影响排序,所以我也使用它们。您可以不求助于尝试此操作,如果出现问题 comm 将给出一个错误,其中一个文件未排序。