如何将 dir 中的所有文件与另一个文件进行比较并打印公共行的输出

如何将 dir 中的所有文件与另一个文件进行比较并打印公共行的输出

首先我有一个由 100 个 .txt 文件组成的 dir/

john_1.txtjohn_2.txtjohn_3.txtjohn_4.txt,由 ex 组成。id;email;name;phone 然后我还有另一个文件emails.txt,其中包含逐行列出的电子邮件地址。

如何将所有文件与此电子邮件文件进行比较并打印公共行。

grep或者diff

答案1

awk,类似这样:

awk -F\; 'NR == FNR {A[$0]=1; next}; A[$2] == 1;' emails.txt john*.txt

NR == FNR测试所有文件中计数的记录(行)号是否与当前文件中的记录号相同,这是测试这是否是第一个文件的有趣方法。如果是,我们获取整行 read ( $0) 并将其用作名为 的关联数组的键A,将值设置为 1,然后跳转到next输入行。如果不是第一个文件(未进行跳转),则取该$2行的第二个字段 ( ),用分号分隔(由 设定-F),然后查看数组中相应的值是否A为 1。如果是,默认操作是打印整行。例如,您可以添加{print $1}仅打印第一个字段。


grep你一起就可以做到

grep -F -f emails.txt john*.txt

-F对于固定字符串模式,-f从文件中读取模式。)但这也会打印部分匹配项,以及文件中其他字段的匹配项,但这可能不是姓名、电话号码和电子邮件地址的问题。

不过,可以通过在用作模式的每行的开头和结尾添加分号来解决这个问题。如果支持进程替换,这应该可以工作:

grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt 

相关内容