搜索一个文件的行以在另一个文件中进行部分匹配(Mac / Linux / Unix命令行)

时间:2014-02-28 20:16:45

标签: linux email unix csv grep

我有两个文本文件。一个是包含姓名,电子邮件地址和其他字段的CSV文件。另一个只包含电子邮件地址。有没有一种简单的方法来搜索CSV文件并仅输出“电子邮件地址列表”文件中没有匹配项的行?

如果有人可以指出我正确的方向,我会很乐意弄清楚并为其他人发布答案。我的猜测是我需要用cat和grep做一些事情,但是我的Google搜索(和堆栈溢出搜索)以及命令行上的努力到目前为止还没有效果。

虽然我可以轻松地在Excel甚至SQL中执行相同的操作,但这将是一个持续的需求,因此shell命令会更好,因为不需要下载CSV文件的步骤,转换到Excel或导入数据库。

提前感谢任何指导 - 克里斯

1 个答案:

答案 0 :(得分:0)

您可以使用awk执行以下操作:

awk -F, 'NR == FNR {file1[$1]; next} !($2 in file1)' /path/to/file1 /path/to/file2

其中file1包含的文件仅包含电子邮件地址,file2是CSV文件。

awk程序加载数组中的所有电子邮件地址,然后检查file2中的第二个字段是否与数组匹配(如果没有,则打印{{1}中的整个相应行这部分是隐含的)。该程序假定字段分隔符实际上是逗号;如果没有,请使用file2选项设置实际分隔符。该程序还假设电子邮件地址存储在CSV文件的第二个字段中;如果没有,请将-F更改为$2,其中$x是字段编号(从1开始)。

您可能会在电子邮件地址列表中遇到问题,因为它存储在内存中很长。

示例:

x

更新:如果CSV可以包含带引号的电子邮件地址,则应删除引号,如下所示:

file1:
email2
email3

file2:
name1,email1,other1,otherother1
name2,email2,other2,otherother2
name3,email3,other3,otherother3
name4,email4,other4,otherother4

output:
name1,email1,other1,otherother1
name4,email4,other4,otherother4