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.txt
和 2.txt
行没有一致的行终止符。有些有一个 CR 字符 (ctrl-M) 但不是唯一的换行符 Linux 期望文本文件。例如,其中一个 registry^M
与 registry
不匹配(Linux 检查文本的程序会将 ^M
视为另一个字符或白色 space 但而不是作为被忽略的行终止)。当您使用某些文本编辑器查看该文件时,^M
不可见,因此看起来 registry
在两个地方都相同,但事实并非如此。
你可以试试:
dos2unix 1.txt 2.txt
comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt
dos2unix
将使所有行终止正确(假设它们可能正在使用 DOS CR)。请注意,这可能会稍微影响排序,所以我也使用它们。您可以不求助于尝试此操作,如果出现问题 comm
将给出一个错误,其中一个文件未排序。
我想从文件 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.txt
和 2.txt
行没有一致的行终止符。有些有一个 CR 字符 (ctrl-M) 但不是唯一的换行符 Linux 期望文本文件。例如,其中一个 registry^M
与 registry
不匹配(Linux 检查文本的程序会将 ^M
视为另一个字符或白色 space 但而不是作为被忽略的行终止)。当您使用某些文本编辑器查看该文件时,^M
不可见,因此看起来 registry
在两个地方都相同,但事实并非如此。
你可以试试:
dos2unix 1.txt 2.txt
comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt
dos2unix
将使所有行终止正确(假设它们可能正在使用 DOS CR)。请注意,这可能会稍微影响排序,所以我也使用它们。您可以不求助于尝试此操作,如果出现问题 comm
将给出一个错误,其中一个文件未排序。