unix 从一个文件中查找在另一个文件中不存在的行[重复]

qlzsbp2j  于 2023-03-29  发布在  Unix
关注(0)|答案(4)|浏览(135)

此问题在此处已有答案

Fast way of finding lines in one file that are not in another?(11个答案)
5年前关闭。
我有两个文件(假设是a.txtb.txt),这两个文件都有一个名称列表。
现在我想找到a.txt中没有的行。
(我花了很多时间来寻找这个问题的答案,所以记录下来供将来参考)

ds97pgxw

ds97pgxw1#

您必须使用的命令不是diff,而是comm

/usr/bin/comm -23 a.txt b.txt

默认情况下,comm输出3列:* left only right only *、both-1-2-3开关抑制这些列。
因此,-23隐藏了 right-onlyboth 列,显示仅出现在第一个(左侧)文件中的行。
如果你想找到同时出现在这两个列中的行,你可以使用-12,它隐藏了 * left-only * 和 * right-only * 列,只剩下 both 列。

r3i60tvu

r3i60tvu2#

简单的答案对我不起作用,因为我没有意识到comm逐行匹配,所以一个文件中的重复行将被打印为另一个文件中不存在。例如,如果file1包含:

Alex
Bill
Fred

file2包含:

Alex
Bill
Bill
Bill
Fred

然后comm -13 file1 file2将输出:

Bill
Bill

在我的例子中,我只想知道file2中的每个字符串都存在于file1中,而不管该行在每个文件中出现了多少次。

**方案一:**将-u(unique)标志用于sort

comm -13 <(sort -u file1) <(sort -u file2)

解决方案2:(我找到的第一个“工作”答案)来自unix.stackexchange

fgrep -v -f file1 file2
请注意,如果file2包含file1中根本不存在的重复行,fgrep将输出每个重复行。还要注意,我在一台笔记本电脑上对一个(相当大的)数据集进行的完全非科学测试显示,解决方案1(使用comm)比解决方案2(使用fgrep)快近5倍。

55ooxyrt

55ooxyrt3#

我不知道为什么不应该使用diff。我会用它来比较两个文件,然后只输出左边文件中的行,而不是右边文件中的行。这样的行由<标记,所以在行的开头grep那个符号就足够了

diff a.txt b.txt  | grep \^\<
uurity8g

uurity8g4#

如果文件还没有被排序,你可以用途:

comm -23 <(sort a.txt) <(sort b.txt)

相关问题