我从两个不同的数据库中提取记录,并将它们保存在两个单独的文件中,假设File1.txt
和File2.txt
。
我想比较这两个文件,就像sql减去运算符一样。
假设File1.txt包含类似
的数据COL1|COL2|COL3
A1|A2|A3
B1|B2|B3
和File2.txt包含
之类的数据COL1|COL2|COL3
A1|A2|A3
C1|C2|C3
我想做一些像File1.txt减去File2.txt的内容,这样我就会得到B1|B2|B3
作为输出,如果File2.txt减去File1.txt,我会得到C1|C2|C3
。
我如何在shell脚本中实现这一点。请帮忙
答案 0 :(得分:3)
尝试使用grep
,如下所示:
grep -F -x -v -f file2 file1
请注意:
-F FILE takes patterns from FILE
-x match whole line
-v show non-matching
答案 1 :(得分:2)
这是comm
的用途
comm -23 file1 file2 # b...
comm -13 file1 file2 # c...
检查您的comm
手册页
需要对输入进行排序。最后的答案可能会有点复杂。
答案 2 :(得分:1)
如果您想基于常见的字段而不是完整的行进行比较,那么您可以在awk中编写解决方案脚本。例如,
awk -F '|' 'NR==FNR{keys[$1]++;next;} $1 in keys{next;} 1' File2.txt File1.txt
这将File2.txt的第一个“列”读入一个数组keys[]
,然后逐步执行File1.txt,跳过其键与File2.txt中的键匹配的任何行,然后打印其余行。它适用于您问题中的样本数据,即使您更改了任一文件中第2列或第3列的内容。
当然,如果你在处理File2.txt中的十亿条记录,它们可能不适合awk可用的内存。