in reply to Need to create a blender to mix up lines from a file

or if you have unequal sized groups of domains then this may suit:

use warnings; use strict; my %domains; while (my $line = <DATA>) { chomp $line; my ($name, $domain) = split /@/, $line; $domains{$domain} = [] if ! defined $domains{$domain}; push @{$domains{$domain}}, $line; } my @counts; my $avg = 0; for my $domain (keys %domains) { my $count = scalar @{$domains{$domain}}; $avg += $count; push @counts, $count } $avg /= @counts; my @ballanced; for my $domain (keys %domains) { my @names = @{$domains{$domain}}; if (@names <= int $avg) { push @ballanced, [@names]; next; } my $toIns = @names / int $avg; my $inc = int (@ballanced / $toIns); $inc = 1 if $inc < 1; my $index = 0; while (@names) { my @sublist = splice @names, 0, $avg; splice @ballanced, $index, 0, [@sublist]; $index += $inc; } } my $going = 1; while ($going) { $going = 0; for my $addrs (@ballanced) { next if ! @$addrs; my $name = shift @$addrs; print "$name\n"; $going = 1; } } __DATA__ ads1@domain.com ads2@domain.com ads1@domain1.com ads2@domain1.com ads1@domain2.com ads2@domain2.com ads3@domain2.com ads4@domain2.com ads1@domain3.com ads1@domain4.com ads2@domain4.com

Prints:

ads1@domain2.com ads1@domain4.com ads3@domain2.com ads1@domain.com ads1@domain3.com ads1@domain1.com ads2@domain2.com ads2@domain4.com ads4@domain2.com ads2@domain.com ads2@domain1.com

Perl is Huffman encoded by design.