В следующем Perl-скрипте используется структура данных, называемая Hash -of -Arrays (или HoA ). Хэш (%sites )имеет ключ, полученный из первых трех полей (site,region,town ), и каждый элемент хеша представляет собой массив, содержащий ВСЕ итоги для этого конкретного ключа.
Он читается в каждой строке для создания HoA -, удаляя все начальные или конечные пробелы и игнорируя все пустые строки. Он также игнорирует комментарии (все, что начинается с символа #
), потому что это тривиально легко сделать, и я думаю, что полезно иметь возможность комментировать данные в текстовых файлах данных.
После того, как сценарий закончил чтение всего входного файла, он сортирует в обратном порядке массивы, принадлежащие каждому ключу, а затем выводит итоговую строку, содержащую только 3 первых значения для каждого.
#!/usr/bin/perl
my %sites=();
while(<>) {
chomp;
s/#.*//; # strip comments #
s/^\s*|\s*$//g; # strip leading and trailing spaces
next if (/^$/); # skip blank lines
my($site,$region,$town,$total) = split /,/;
my $key = "$site,$region,$town";
push @{ $sites{$key} }, $total;
}
foreach my $k (sort keys %sites) {
@{ $sites{$k} } = reverse sort @{ $sites{$k} };
print $k. ": ". join(", ",@{ $sites{$k}}[0..2] ), "\n";
};
образец вывода:
$./jon.pl input.txt
site1,North,Bristol: 996776, 9776, 6776
site2,South,Guildford: 99392, 392, 2392
site2,South,London: 99381, 381, 2381
site3,Central,Birmingham: 992628, 5628, 2628
site3,Wales,Cardiff: 99834, 9834, 834
site3,Wales,Swansea: 991796, 3796, 21796
site5,South,Guildford: 99338, 338, 2338
site5,South,London: 99266, 3266, 266
site5,South,Windsor: 99359, 359, 2359
site5,West,Bristol: 997700, 9700, 7700
input.txt
содержит предоставленные вами образцы данных, скопированные несколько раз, с отредактированными в копиях суммами.
Вывод можно легко изменить, чтобы сделать его более красивым, или вывести по одной строке для каждой общей (подсказки, выполнить цикл по элементам массива [0..2], а не соединять ()их ).
Кстати, возможно реализовать что-то подобное в awk
, но это намного проще сделать в perl
.