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的两个文件。。。