2015-05-23 2 views
-3

Я новичок в Perl и нуждаюсь в помощи при сортировке с использованием хэша и/или любого другого возможного метода, который может быть выполнен в Perl.Perl сортировать с отметкой времени с помощью hash

У меня есть входной файл, как показано ниже, и хотел бы сгенерировать выходной файл, как показано.

Я думаю, если это можно сделать, поставив его в хэш, а затем сравнив? Пожалуйста, также дайте пояснения к шагам для учебной цели, если это возможно.

Если файл имеет повторяющиеся/трехкратные записи, соответствующие разной временной отметке, он должен содержать только список последних записей временной метки.

входного файла

 
A May 19 23:59:14 
B May 19 21:59:14 
A May 22 07:59:14 
C Apr 10 12:23:00 
B May 11 10:23:34 

Выход должен быть

 
A May 22 07:59:14 
B May 19 21:59:14 
C Apr 10 12:23:00 
+4

Вы пробовали что-нибудь? – Borodin

+0

Я попробовал команду sort, но хотел бы посмотреть, возможно ли это с помощью хэша Perl, поскольку у меня есть тысячи таких записей и вам нужно что-то, что можно сделать быстрее. Однако команда сортировки не выполнялась. –

+0

Хэш не поможет вам сортировать данные. Пожалуйста, покажите код, который вы пробовали – Borodin

ответ

1

Вы можете попробовать использовать ваши данные (A, B и т.д.) в качестве ключа и временной метки в качестве значения в PERL хэш. Затем прочитайте входной файл и сравните временные метки с использованием типа данных perl time. Таким образом, вы сохраняете только последние записи, а другие могут быть отброшены. Распечатайте результат в конце.

+0

Спасибо. Вот мой код ... –

+0

Это не сработало. –

+0

#!/usr/bin/perl % dls; open (LOG, "/ tmp/input_file"); while ($ line = ) { #print $ line; $ dl = substr $ line, 0,1; $ timestamp = substr $ line, 2; if ($ timestamp> $ dls {dl}) ​​{ $ dls {dl} = $ timestamp; } } foreach $ dlname (ключи сортировки% dls) { print TMP "$ dlname, $ dls {$ dlname} \ n"; } ~ –

1

Хеш хорош для слипания дубликатов. Однако сортировка по временной отметке требует преобразования представления «текст» в фактическое время. Time::Piece это один из лучших вариантов для этого

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use Time::Piece; 
my %things; 
while (<DATA>) { 
    my ($letter, $M, $D, $T) = split; 
    my $timestamp = 
     Time::Piece->strptime("$M $D $T 2015", "%b %d %H:%M:%S %Y"); 
    if (not defined $things{$letter} 
     or $things{$letter} < $timestamp) 
    { 
     $things{$letter} = $timestamp; 
    } 

} 

foreach my $thing (sort keys %things) { 
    print "$thing => ", $things{$thing}, "\n"; 
} 

__DATA__ 
A May 19 23:59:14 
B May 19 21:59:14 
A May 22 07:59:14 
C Apr 10 12:23:00 
B May 11 10:23:34 

Примечания, хотя - ваши временные метки являются неоднозначными, поскольку они опускают год. Вы должны иметь дело с этим в некотором роде. Я пошел на простой путь просто вставить 2015 год. Это не очень хорошая практика - по крайней мере, вы должны использовать какой-то способ открытия «текущего года» автоматически, но имейте в виду, что в некоторые моменты года это будет просто Ломать.

Вы можете форматировать выходные данные с использованием метода strftime в пределах Time::Piece - это всего лишь выходной сигнал по умолчанию.

+0

Отлично. Благодарим вас за руководство и быстрое решение Sobrique.Еще раз спасибо за вашу помощь. –

Смежные вопросы