Files

如何在忽略行的其他部分的同時從 grep 模式匹配中輸出唯一行?

  • May 18, 2021

假設我有一個名為 的文件names.txt,其中包含以下格式的人員姓名和相應電子郵件的列表:

FName1 LName1 <random1@test.com>
FName2 LName2 <random2@test2.com>
FName3 LName3 <random3@test3.com>
FName4 <random1@some.com>
FName5 MName1 LName4 <something@test34.com>
FName1 LName1 <random01@asdf.com>
...

我想要完成的是輸出所有獨特的人,不區分大小寫,基於名稱(即忽略電子郵件)來自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結果並將它們作為標準輸入發送到其他命令中?任何回饋或建議將不勝感激。

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

你可以反過來。忽略電子郵件:

cut -d'<' -f1 names.txt | sort -fu

這會在分隔符處切斷行<,並列印第一個欄位,排序(忽略大小寫-f),然後只保留僅在大小寫上不同的名稱中的第一個(也忽略大小寫-u)。

引用自:https://unix.stackexchange.com/questions/650184