Files
如何在忽略行的其他部分的同時從 grep 模式匹配中輸出唯一行?
假設我有一個名為 的文件
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
)。