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
)。