反向grep,找到所有不匹配

时间:2016-04-05 19:26:23

标签: bash sed grep diff

我有两个包含一些类似数据和一些唯一数据的文件。 我想知道 first.txt 中出现的哪些数据未出现在 second.txt 中。

起初,我认为使用diff作为显而易见的选项,但数据在文件中出现的顺序很重要。

这就是我的意思。如果数据是有序的,那么我得到了我期望的信息。

macbook:labs alex$ cat first.txt
1
2
3
4
5
macbook:labs alex$ cat second.txt
1
3
5
macbook:labs alex$ diff first.txt second.txt
2d1
< 2
4d2
< 4

但是,如果我们将文件内部数据的顺序混合一点,那么输出就会大不相同

macbook:labs alex$ cat first.txt
5
2
1
4
3
macbook:labs alex$ cat second.txt
3
1
5
macbook:labs alex$ diff first.txt second.txt
1,4d0
< 5
< 2
< 1
< 4
5a2,3
> 1
> 5

我还想过在一种循环中使用grep

#!/bin/bash
a="first.txt"
b="second.txt"

for row in `cat $a`
  do grep $row $b
done

但是,这只会告诉我第二次中的内容,也就是第一次。我想找出第一个

的独特之处

也许我不太了解它,但grep的 - 反向选项似乎也没有帮助我。

#!/bin/bash
a="first.txt"
b="second.txt"
for row in `cat $b`
 do
  grep -v $row $a
 done

有人可以对此发光吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

如果您有选择,可以使用comm查找第一个文件的唯一数据,如下所示:

comm -23 file1 file2

-23会抑制两个文件中的行,或仅抑制文件2中的行。首先需要对文件进行排序,但如果不是,则可以通过sort命令对其进行管道。

答案 1 :(得分:0)

  

我想了解first.txt中没有出现second.txt

中出现的数据

您可以使用grep -vf

grep -vFf second.txt first.txt

2
4