sub sort_by_ip { return map { substr($_, 4) } sort map { pack("C4a*", split(/\./), $_) } @_; } my %data; while () { chomp; my ($src, $dest, $dst_port) = (split)[5,9,10]; $data{$src}{$dest}{$dst_port}++; } foreach my $src (sort_by_ip keys %data ) { foreach my $dest (sort_by_ip keys %{$data{$src}} ) { foreach my $dst_port (sort { $a <=> $b } keys %{$data{$src}{$dest}}) { print "$src $dest $dst_port $data{$src}{$dest}{$dst_port}\n"; }}}