我有一个文件如下 的 A.TXT
1
2
3
4
第二个文件如下 的 B.txt
1
2
3
6
我想知道A.txt里面是什么,但不知道B.txt里面是什么 即它应该打印值4
我想在Linux上这样做。
答案 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
&