私はリストを持っています:
asd@domain.com
fff@domain.com
yyy@domain.com
ttt@test.com
rrr@test.com
fff@test.com
yyy@my.com
yyy@my.com
これを行う方法:
リスト全体で同じドメインのメールが3つ以上ある場合は、最初の1つを除くすべての重複を削除する必要があります。
Output:
asd@domain.com
ttt@test.com
yyy@my.com
yyy@my.com
#!/usr/bin/env perl
use strict; use warnings;
use Email::Address;
my %data;
while (my $line = <DATA>) {
my ($addr) = Email::Address->parse($line =~ /^(\S+)/);
push @{ $data{ $addr->host } }, $addr->original;
}
for my $addrs (values %data) {
if (@$addrs > 2) {
print "$addrs->[0]\n";
}
else {
print "$_\n" for @$addrs;
}
}
__DATA__
asd@domain.com
fff@domain.com
yyy@domain.com
ttt@test.com
rrr@test.com
fff@test.com
yyy@my.com
yyy@my.com
sed -s 's/@/@\t/g' test.txt | uniq -f 1 | sed -s 's/@\t/@/g'
最初の sed は、重複するドメインを削除するときに uniq が最初のフィールドをスキップできるように、電子メールを 2 つのフィールド (名前 + ドメイン) にタブ文字で区切り、最後の sed はタブを削除します。
順序が気にならない場合は、並べ替えを使用してください。
sort -t '@' -u -k 2,2 your_file
順序を気にする場合は、
gawk '{print NR "@" $0}' your_file | sort -t '@' -u -k 3,3 | sort -t '@' -k 1,1n | cut -d \@ -f 2-
あなたの例の出力にyyy@my.com
2回含まれているのは不思議ですが、それは間違いだと思います.
末尾のスペース文字やより複雑な形式の電子メール アドレスに問題がない限り、これは Perl で次のように簡単に行うことができます。
perl -aF@ -ne 'print unless $seen{$F[1]}++' myfile
出力
asd@domain.com
ttt@test.com
yyy@my.com
これはあなたのために働くかもしれません:
sed ':a;$!N;s/^\([^@]*@\([^\n]*\)\)\n.*\2/\1/;ta;P;D' file
asd@domain.com
ttt@test.com
yyy@my.com