如何从 grep 模式匹配中输出唯一的行,同时忽略该行的其他部分?

如何从 grep 模式匹配中输出唯一的行,同时忽略该行的其他部分?

假设我有一个名为 的文件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)。

相关内容