两个文件

时间:2017-07-04 08:22:55

标签: grep

我有两个文本文件,每个文件包含一列,例如 -

File_A File_B

1 1

2 2

3 8

如果我grep -f File_A File_B > File_C,我得到包含1和2的File_C。我想知道如何在两个文件上使用grep -v,这样我就可以得到上面的非匹配值3和8示例

感谢。

3 个答案:

答案 0 :(得分:1)

如果允许空输出分隔符

,也可以使用comm
$ # -3 means suppress lines common to both input files
$ # by default, tab character appears before lines from second file
$ comm -3 f1 f2
3
    8
$ # change it to empty string
$ comm -3 --output-delimiter='' f1 f2
3
8

注意:comm需要排序输入,因此如果尚未排序,请使用comm -3 --output-delimiter='' <(sort f1) <(sort f2)


您还可以将从grep获取的公共行作为输入传递给grep -v。使用GNU grep进行测试,某些版本可能不支持所有这些选项

$ grep -Fxf f1 f2 | grep -hxvFf- f1 f2
3
8
  • -F选项以字面匹配字符串,而不是正则表达式
  • -x选项仅匹配整行
  • -h取消文件名前缀
  • f-接受stdin而不是文件输入

答案 1 :(得分:0)

awk 'NR==FNR{a[$0]=$0;next} !($0 in a) {print a[(FNR)], $0}' f1 f2
3 8

要了解NRFNR的含义,请检查其打印输出的下方。

awk '{print NR,FNR}' f1 f2
1 1
2 2
3 3
4 4
5 1
6 2
7 3
8 4

条件NR==FNR用于从第一个文件中提取数据,因为NRFNR对于第一个文件都是相同的。

答案 2 :(得分:0)

使用GNU diff命令(逐行比较文件):

diff --suppress-common-lines -y f1 f2 | column -t

输出(左列包含来自f1的行,右列 - 来自f2):

3  |  8

-y, --side-by-side - 两列输出