1

私はリストを持っています:

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
4

5 に答える 5

3
#!/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
于 2012-04-08T20:10:48.443 に答える
1
 sed -s 's/@/@\t/g' test.txt | uniq -f 1 | sed -s 's/@\t/@/g'

最初の sed は、重複するドメインを削除するときに uniq が最初のフィールドをスキップできるように、電子メールを 2 つのフィールド (名前 + ドメイン) にタブ文字で区切り、最後の sed はタブを削除します。

于 2012-04-08T19:45:31.163 に答える
0

順序が気にならない場合は、並べ替えを使用してください。

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-
于 2012-04-09T10:19:22.967 に答える
0

あなたの例の出力にyyy@my.com2回含まれているのは不思議ですが、それは間違いだと思います.

末尾のスペース文字やより複雑な形式の電子メール アドレスに問題がない限り、これは Perl で次のように簡単に行うことができます。

perl -aF@ -ne 'print unless $seen{$F[1]}++' myfile

出力

asd@domain.com
ttt@test.com
yyy@my.com
于 2012-04-08T21:26:22.317 に答える
0

これはあなたのために働くかもしれません:

sed ':a;$!N;s/^\([^@]*@\([^\n]*\)\)\n.*\2/\1/;ta;P;D' file
asd@domain.com
ttt@test.com
yyy@my.com
于 2012-04-09T00:31:12.857 に答える