Unix 从文件中查找其他文件中不存在的行

Unix 从文件中查找其他文件中不存在的行,unix,text-files,Unix,Text Files,我有两个文件(比如a.txt和b.txt),它们都有一个名称列表。我已经对这两个文件运行了sort 现在我想从a.txt中查找b.txt中不存在的行 (我花了很多时间来寻找这个问题的答案,因此将其记录下来以备将来参考)您必须使用的命令不是diff,而是comm comm -23 a.txt b.txt 默认情况下,comm输出3列:仅左、仅右、两列。-1、-2和-3开关抑制这些列 因此,-23仅隐藏右侧和两列,显示仅出现在第一个(左侧)文件中的行 如果你想找到同时出现在这两行中的行,你可以使用

我有两个文件(比如
a.txt
b.txt
),它们都有一个名称列表。我已经对这两个文件运行了
sort

现在我想从
a.txt
中查找
b.txt
中不存在的行


(我花了很多时间来寻找这个问题的答案,因此将其记录下来以备将来参考)

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

comm -23 a.txt b.txt
默认情况下,
comm
输出3列:仅左、仅右、两列。
-1
-2
-3
开关抑制这些列

因此,
-23
仅隐藏右侧和两列,显示仅出现在第一个(左侧)文件中的行


如果你想找到同时出现在这两行中的行,你可以使用
-12
,它只隐藏左列和右列,只留下两列。

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

Alex
Bill
Fred
Alex
Bill
Bill
Bill
Fred
文件2包括:

Alex
Bill
Fred
Alex
Bill
Bill
Bill
Fred
然后,
comm-13 file1 file2将输出:

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

解决方案1:使用
-u
(唯一)标志进行
排序


comm-13我不知道为什么有人说不应该使用
diff
。我会用它来比较两个文件,然后只输出左文件中的行,而不是右文件中的行。这些行由diff用
标记。如果文件尚未排序,您可以使用:

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

comm-23我要补充的是,只有当两个文件都被排序时,这才有效。(我知道OP提到他对文件进行了排序,但包括我在内的许多人都阅读了问题标题,然后跳到了答案上)@user247866:幸运的是,如果没有排序,comm会告诉你:)我已经对我的文件进行了排序,并通过了uniq。无论如何,感谢其他解决方案。您可以使用
diff--new line format=--unchanged line format=a.txt b.txt
来抑制打印新的和未更改的行。这为我分配了15GB的内存,每个<300 MB的两个文件。。。