此问题在此处已有答案:
Fast way of finding lines in one file that are not in another?(11个答案)
5年前关闭。
我有两个文件(假设是a.txt
和b.txt
),这两个文件都有一个名称列表。
现在我想找到a.txt
中没有的行。
(我花了很多时间来寻找这个问题的答案,所以记录下来供将来参考)
此问题在此处已有答案:
Fast way of finding lines in one file that are not in another?(11个答案)
5年前关闭。
我有两个文件(假设是a.txt
和b.txt
),这两个文件都有一个名称列表。
现在我想找到a.txt
中没有的行。
(我花了很多时间来寻找这个问题的答案,所以记录下来供将来参考)
4条答案
按热度按时间ds97pgxw1#
您必须使用的命令不是
diff
,而是comm
默认情况下,
comm
输出3列:* left only 、 right only *、both。-1
、-2
和-3
开关抑制这些列。因此,
-23
隐藏了 right-only 和 both 列,显示仅出现在第一个(左侧)文件中的行。如果你想找到同时出现在这两个列中的行,你可以使用
-12
,它隐藏了 * left-only * 和 * right-only * 列,只剩下 both 列。r3i60tvu2#
简单的答案对我不起作用,因为我没有意识到
comm
逐行匹配,所以一个文件中的重复行将被打印为另一个文件中不存在。例如,如果file1包含:file2包含:
然后
comm -13 file1 file2
将输出:在我的例子中,我只想知道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倍。55ooxyrt3#
我不知道为什么不应该使用
diff
。我会用它来比较两个文件,然后只输出左边文件中的行,而不是右边文件中的行。这样的行由<
标记,所以在行的开头grep那个符号就足够了uurity8g4#
如果文件还没有被排序,你可以用途: