残りの行を無視しながら、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

おすすめ記事