2016-03-01 63 views
1

我有文件file1file2,其中file2file1的子集。这意味着,如果我遍历file1,也有一些线路是在file2,有的都没有,但在file2没有网上说是不是在file1。文件中可能有几行文本中具有相同的内容。现在我想知道它们之间的区别,即file1的所有行不在file2之间。没有排序的两个文件之间的差异

根据this well received answer

的diff(1)不是答案,COMM(1)是。

(无论出于何种原因)

但据我了解,为comm的文件需要先进行排序。问题:两个文件都是有序的(不是排序!),并且这个顺序需要保留。所以我真正想要的是遍历file1,并检查每一行,如果它也在file2。如果不是,请将其写入file3。如果同一内容出现多次,应该保留多次!

有没有办法用命令行来做到这一点?

回答

3

与GNU的grep试试这个:

grep -vFf file2 file1 > file3 

更新

grep -vxFf file2 file1 > file3 
+0

看起来看第一行后良好。我无法确定地说(文件太长),但我认为这是解决方案。谢谢! –

+0

嗯好吧我只是比较行号。它应该是5213,但它是5211.不幸的是,非常小的差异,但并不完全正常工作。 –

+0

请将file1和file2上传到某处。 – Cyrus

0

我想你不想排序为避免临时文件。这是可能的进程替换:

diff <(sort file1) <(sort file2) 
# or 
comm <(sort file1) <(sort file2) 

编辑:使用https://stackoverflow.com/a/4544925/3220113我发现了另一种选择(与短行的文本文件):

diff -a --suppress-common-lines -y file2 file1 | sed 's/\s*>.//' 
+0

我不想排序,因为我想保留订单。 –

+0

我添加了一个替代没有排序 –