我有两个文本文件,每个文件包含一列,例如 -
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示例
感谢。
答案 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
要了解NR
和FNR
的含义,请检查其打印输出的下方。
awk '{print NR,FNR}' f1 f2
1 1
2 2
3 3
4 4
5 1
6 2
7 3
8 4
条件NR==FNR
用于从第一个文件中提取数据,因为NR
和FNR
对于第一个文件都是相同的。
答案 2 :(得分:0)
使用GNU diff
命令(逐行比较文件):
diff --suppress-common-lines -y f1 f2 | column -t
输出(左列包含来自f1
的行,右列 - 来自f2
):
3 | 8
-y, --side-by-side
- 两列输出