2013-01-23 81 views
61

我有两个文件(比如说a.txtb.txt),它们都有一个名称列表。我已经在这两个文件上运行了sort从文件中查找不在另一个文件中的行

现在我想找到a.txt这行不在b.txt中的行。

(我花了很多时间来找到这个问题的答案,所以记录以供将来参考)

回答

101

,你必须使用的命令是不是diffcomm

comm -23 a.txt b.txt 

默认情况下, comm输出3列:只剩,右键,均为-1-2-3开关禁止这些列。

所以,-23隐藏右仅两者列,显示只出现在第一(左)文件中的行。

如果你想找到出现在两条线,你可以使用-12,隐藏左仅右只列,让你只用列。

+9

我会补充说,这只适用于两个文件都被排序的情况。 (我知道OP提到他对这些文件进行了排序,但是包括我在内的很多人阅读了问题标题,然后跳到答案) – user247866

+1

@ user247866:幸运的是,通信足以告诉你他们是否没有排序:) – marlar

20

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

Alex 
Bill 
Fred 

和File2包含:

Alex 
Bill 
Bill 
Bill 
Fred 

然后comm -13 file1 file2将输出:

Bill 
Bill 

在我的情况,我想知道的只是,每串无论文件在每个文件中出现多少次,文件2都存在于file1中。

解决方案1:unix.stackexchange(第一个 “工作” 的答案,我发现):使用-u(唯一的)标志sort

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

解决方案2

fgrep -v -f file1 file2

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

+0

I将我的文件分类并通过uniq传递。无论如何感谢其他解决方案。 – Sudar

2

我不知道为什么有人说不应该使用diff。我会用它来比较这两个文件,然后只输出左侧文件中的行,而不是右侧的文件。这种线由DIFF与<所以它足以给grep该符号在该行

diff a.txt b.txt | grep \^\< 
+1

您可以使用'diff --new-line-format = --unchanged-line-format = a.txt b.txt'来禁止打印新的和未更改的行。 –

3

在这些文件不会被尚未整理的情况下开始标记,你可以使用:

comm -23 <(sort a.txt) <(sort b.txt) 
相关问题