我想从文件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
答案 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.txt
与registry^M
不匹配(检查文本的Linux程序会将registry
视为另一个字符或空格,而不是被忽略的行终止符)。当您使用某些文本编辑器查看文件时,^M
不可见,因此^M
在两个地方都相同,但事实并非如此。
您可以尝试:
registry
dos2unix 1.txt 2.txt
comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt
将使所有线路终端正确(假设它们可能正在使用DOS CR)。请注意,这可能会稍微影响排序,因此我也正在使用它们。您可以尝试使用此方法,而无需诉诸任何手段,并且如果出现问题dos2unix
,则会出现错误,指出其中一个文件未排序。