Если я правильно получил разъяснения в комментариях, цель состоит в том, чтобы найти среднее значение (второй столбец) для уникальных имен в первом столбце. Тогда нет необходимости во внешних инструментах.
Читайте файл построчно и складывайте значения для каждого имени. Уникальность имени обеспечивается использованием хэша с именами, являющимися ключами. Наряду с этим также отслеживать их количество
use warnings;
use strict;
use feature 'say';
my $file = shift // die "Usage: $0 filename\n";
open my $fh, '<', $file or die "Can't open $file: $!";
my %results;
while (<$fh>) {
#my ($name, $value) = split /\t/;
my ($name, $value) = split /\s+/; # used for easier testing
$results{$name}{value} += $value;
++$results{$name}{count};
}
foreach my $name (sort keys %results) {
$results{$name}{value} /= $results{$name}{count}
if $results{$name}{count} > 1;
say "$name => $results{$name}{value}";
}
После обработки файла каждое накопленное значение делится на его счет и перезаписывается на него, поэтому его среднее значение (/=
делит и присваивает), если считать > 1
(в качестве небольшой меры эффективности).
Если есть какая-либо польза от знания всех значений, найденных для каждого имени, то сохраните их в arrayref для каждого ключа вместо добавления их
while (<$fh>) {
#my ($name, $value) = split /\t/;
my ($name, $value) = split /\s+/; # used for easier testing
push @{$results{$name}}, $value;
}
где теперь нам не нужен счетчик, так как он определяется количеством элементов в массиве (ref)
use List::Util qw(sum);
foreach my $name (sort keys %results) {
say "$name => ", sum(@{$results{$name}}) / @{$results{$name}};
}
Обратите внимание, что построенный таким образом хеш требует памяти, сопоставимой с размером файла (или может даже превышать его), поскольку все значения сохраняются.
Это было проверено с использованием показанных двух строк данных образца, повторено и изменено в файле. Код никак не проверяет ввод, но ожидает, что второе поле всегда будет числом.
Обратите внимание, что нет никаких причин выходить из нашей программы и использовать внешние команды.