通讯-23不删除所有常用行

时间:2018-11-22 15:26:50

标签: duplicates 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

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

我不确定您是如何生成文本文件的,但是问题是您的j3 = j2 > 4; print(j2[j3]) 1.txt行中的某些行没有一致的行终止符。有些具有CR字符(ctrl-M),但是Linux期望文本文件不具有唯一输入。例如,其中一个的2.txtregistry^M不匹配(检查文本的Linux程序会将registry视为另一个字符或空格,而不是被忽略的行终止符)。当您使用某些文本编辑器查看文件时,^M不可见,因此^M在两个地方都相同,但事实并非如此。

您可以尝试:

registry

dos2unix 1.txt 2.txt comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt 将使所有线路终端正确(假设它们可能正在使用DOS CR)。请注意,这可能会稍微影响排序,因此我也正在使用它们。您可以尝试使用此方法,而无需诉诸任何手段,并且如果出现问题dos2unix,则会出现错误,指出其中一个文件未排序。