首页 > 解决方案 > uniq 仅由行的一部分

问题描述

我正在尝试合并电子邮件列表,但我想uniq(或uniq -i -u)按电子邮件地址,而不是整行,这样我们就不会重复。

清单 1:

Company A <companya@companya.com>
Company B <companyb@companyb.com>
Company C <companyc@companyc.com>

清单 2:

firstname lastname <firstname@gmail.com>
Fake Person <companyb@companyb.com>
Joe lastnanme <joe@gmail.com>

当前输出为

Company A <companya@companya.com>
Company B <companyb@companyb.com>
Company C <companyc@companyc.com>
firstname lastname <firstname@gmail.com>
Fake Person <companyb@companyb.com>
Joe lastnanme <joe@gmail.com>

所需的输出将是

Company A <companya@companya.com>
Company B <companyb@companyb.com>
Company C <companyc@companyc.com>
firstname lastname <firstname@gmail.com>
Joe lastnanme <joe@gmail.com>

(如companyb@companyb.com两者中所列)

我怎样才能做到这一点?

标签: emailawkuniq

解决方案


给定您的文件格式

$ awk -F'[<>]' '!a[$2]++' files

将在尖括号中打印重复内容的第一个实例。或者如果邮件后面没有内容,则不需要解开尖括号

$ awk '!a[$NF]++' files

也可以这样sort

$ sort -t'<' -k2,2 -u files

副作用是输出将被排序,这可能是需要的(或不是)。

注意对于这两种选择,假设尖括号不会出现在电子邮件包装器之外的任何地方。


推荐阅读