在unix中是否有任何实用程序,如sql中的minus运算符

时间:2015-10-09 11:28:12

标签: sql shell unix

我从两个不同的数据库中提取记录,并将它们保存在两个单独的文件中,假设File1.txtFile2.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脚本中实现这一点。请帮忙

3 个答案:

答案 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可用的内存。