如何找到另一个文件中缺少的行

时间:2014-01-17 14:58:04

标签: linux sed awk grep

在Linux机器上的

我有一个文件如下 的 A.TXT

1
2
3
4

第二个文件如下 的 B.txt

1
2
3
6

我想知道A.txt里面是什么,但不知道B.txt里面是什么 即它应该打印值4

我想在Linux上这样做。

5 个答案:

答案 0 :(得分:17)

awk 'NR==FNR{a[$0]=1;next}!a[$0]' B A

没有测试,试一试

答案 1 :(得分:13)

如果文件按样本输入显示排序,请使用comm:

$ comm -23 A.txt B.txt
4

如果文件未分类,请参阅@ Kent的awk解决方案。

答案 2 :(得分:3)

您也可以使用grep通过组合-v(显示不匹配的行),-x(匹配整行)和-f(从文件读取模式)选项来执行此操作:

$ grep -v -x -f B.txt A.txt
4

这不依赖于文件的顺序 - 它将从A中删除与B中的一行匹配的任何行。

答案 3 :(得分:2)

使用diff:

diff --changed-group-format='%<' --unchanged-group-format='' A.txt B.txt

答案 4 :(得分:0)

(@ rjmunro回答的补充)

使用grep的正确方法是:

$ grep -F -v -x -f B.txt A.txt
4

如果没有-F标志,grep会解释PATTERN,从B.txt读取,作为基本正则表达式(BRE),这在此处是不受欢迎的,并且可能导致麻烦。 -F标记使grep将PATTERN视为一组换行符分隔的字符串。例如:

$ cat A.txt
&
^
[
]

$ cat B.txt
[
^
]
|

$ grep -v -x -f B.txt A.txt
grep: B.txt:1: Invalid regular expression

$ grep -F -v -x -f B.txt A.txt
&