Вот решение, которое будет полагаться на входной файл, уже отсортированный соответствующим образом.Он будет построчно сканировать строки с одинаковым началом (например, два одинаковых первых столбца), проверяет значение третьего столбца и сохраняет строку с наибольшим значением - или строку, которая была первой в файле.При обнаружении нового начала он печатает старую строку и начинает проверку снова.
В конце входного файла выводится максимальная строка в памяти.
use warnings;
use strict;
my ($max_line, $start, $max) = parse_line(scalar <DATA>);
while (<DATA>) {
my ($line, $nl_start, $nl_max) = parse_line($_);
if ($nl_start eq $start) {
if ($nl_max > $max) {
$max_line = $line;
$max = $nl_max;
}
} else {
print $max_line;
$start = $nl_start;
$max = $nl_max;
$max_line = $line;
}
}
print $max_line;
sub parse_line {
my $line = shift;
my ($start, $max) = $line =~ /^([^\t]+\t[^\t]+\t)(\d+)/;
return ($line, $start, $max);
}
__DATA__
1 100 25 T
1 101 26 A
1 101 27 G
1 101 30 A
1 102 40 A
1 102 40 T
Вывод:
1 100 25 T
1 101 30 A
1 102 40 A
Вы указали
Если в третьем столбце есть связь для наибольшего значения, сохраните первое (после упорядочивания файла).
что довольно загадочно.Затем вы запросили вывод, который, казалось бы, противоречил этому, где вместо первого было напечатано last .
Я предполагаю, что вы имели в виду «сохранить первое значение».Если вы действительно имели в виду «сохранить последнее значение», просто измените знак >
в if ($nl_max > $max)
на >=
.Это эффективно сохранит последнее значение равным первому.
Если вы, однако, подразумеваете какую-то сортировку, которая, по-видимому, подразумевает «после упорядочивания файла», то у меня недостаточно информации, чтобы знать, что выимел в виду.