首先我有一个由 100 个 .txt 文件组成的 dir/
john_1.txt
、john_2.txt
、john_3.txt
等john_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