Предположим, что IP-адреса указаны в столбце N:
use strict;
use warnings;
use constant N => 3;
my %counts;
while (<>)
{
my(@fields) = split /\s+/;
$counts{$fields[N]}++;
}
Это дает вам хэш адресов I / P и соответствующих значений.
my %iplist;
foreach my $address (keys %counts)
{
my $count = $counts{$address};
push @{$iplist{$count}}, $address;
}
Это дает вам хэш подсчетов и связанный с каждым отсчетом список IP-адресов с таким подсчетом.
use constant Wanted => 10;
my $printed = 0;
foreach my $count (sort { $b <=> $a } keys %iplist)
{
print "$count: @{$iplist{$count}}\n";
$printed += scalar(@{$iplist{$count}});
last if $printed >= Wanted;
}
Это сортирует счет в обратном (нисходящем) порядке и распечатывает счет и список IP-адресов, которые появлялись так много раз. Он также подсчитывает количество напечатанных адресов и останавливает цикл, когда он соответствует требуемому числу или превышает его.