我有两个文件(比如说a.txt
和b.txt
),它们都有一个名称列表。我已经在这两个文件上运行了sort
。从文件中查找不在另一个文件中的行
现在我想找到a.txt
这行不在b.txt
中的行。
(我花了很多时间来找到这个问题的答案,所以记录以供将来参考)
我有两个文件(比如说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
匹配行的行,所以一个文件中的重复行将被打印为另一行中不存在。例如,如果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倍。
I将我的文件分类并通过uniq传递。无论如何感谢其他解决方案。 – Sudar
我不知道为什么有人说不应该使用diff
。我会用它来比较这两个文件,然后只输出左侧文件中的行,而不是右侧的文件。这种线由DIFF与<
所以它足以给grep该符号在该行
diff a.txt b.txt | grep \^\<
您可以使用'diff --new-line-format = --unchanged-line-format = a.txt b.txt'来禁止打印新的和未更改的行。 –
在这些文件不会被尚未整理的情况下开始标记,你可以使用:
comm -23 <(sort a.txt) <(sort b.txt)
我会补充说,这只适用于两个文件都被排序的情况。 (我知道OP提到他对这些文件进行了排序,但是包括我在内的很多人阅读了问题标题,然后跳到答案) – user247866
@ user247866:幸运的是,通信足以告诉你他们是否没有排序:) – marlar