假设我有一个名为 的文件names.txt
,其中包含人员姓名和相应电子邮件的列表,格式如下:
FName1 LName1 <[email protected]>
FName2 LName2 <[email protected]>
FName3 LName3 <[email protected]>
FName4 <[email protected]>
FName5 MName1 LName4 <[email protected]>
FName1 LName1 <[email protected]>
...
我想要完成的是根据 中的姓名(即忽略电子邮件)输出所有独特的人,不区分大小写names.txt
。因此,输出如下所示:
FName1 LName1
FName2 LName2
FName3 LName3
FName4
FName5 MName1 LName4
请注意,同一名称可以在文件中多次出现,并且名称可以是小写字符、大写字符、数字等的混合。可能出现的名称示例为:“JoHn sMitH JOnes”、“StEve”、或“RoB3rt Fro5t”
我正在努力解决的是如何只输出唯一的名称而不关联电子邮件。我可以使用grep
以下命令来匹配我想要输出的模式:
grep -i "^[A-Za-z0-9]*[ ]*[A-Za-z0-9]*[ ]*[A-Za-z0-9]*" names.txt
但是,我不确定如何使用这些模式结果并输出唯一名称,同时省略每行的电子邮件部分。有什么方法可以使用这些grep
结果并将它们作为标准输入发送到其他命令中吗?任何反馈或建议将不胜感激。
答案1
和awk
:
awk '
{
sub(/<.*/, "") # remove email address
$1 = $1 # remove leading and trailing blanks, squeeze all sequences of blanks
# into one space
if (!seen[tolower($0)]++) print # print if not seen before
}' < names.txt
答案2
你也可以反过来。忽略电子邮件:
cut -d'<' -f1 names.txt | sort -fu
这会在分隔符处剪切行<
,并打印第一个字段,进行排序(忽略大小写-f
),然后仅保留仅大小写不同的第一个名称(也忽略大小写-u
)。