Intereting Posts
Найти команду: как игнорировать регистр? Linux использует второй терминал в минимальной iso Как я могу проверить, настроена ли моя система Linux на синхронизацию изменений на диске? Не удается получить доступ к веб-серверу, но может ssh к нему Как добавить индикатор выполнения в cryptsetup luksFormat? Выполните две команды параллельно, но только дождитесь завершения одной команды, прежде чем запускать следующую Как определить протокол / тип накопителей? Нет звука в Linux Mint после двойной загрузки Windows 8 что означает флаг -z здесь Устройство GPS подключено к Linux Mint 15 Как загрузить мои письма на другой почтовый сервер, который я загрузил через IMAP с моего первого? Как автоматически загружать новый VID и PID в модуль usb_serial Является ли терминал или оболочка ответственными за действия нажатий клавиш? Как настроить DISPLAY для запуска Java JAR Swing Executable из Init.d Пользователь Linux motion – запускает его как ssh-ключ как pi на удаленный сервер

Найти записи, представленные до сегодняшнего дня

как найти рекордные данные о сильфонах с «Последней датой» до сегодняшней даты. т.е.: если сегодня дата 09-04-2014, то поиск записи с «Последней датой» до 09-04-2014

Email ID : abc@domain.com Last Date : 30-04-2014 -- Email ID : abc@domain.com Last Date : 18-03-2014 -- Email ID : abc@domain.com Last Date : 18-02-2013 -- Email ID : abc@domain.com Last Date : 18-05-2015 -- Email ID : abc@domain.com Last Date : 01-05-2012 -- Email ID : abc@domain.com Last Date : 09-04-2014 

Ожидаемый результат:

 Email ID : abc@domain.com Last Date : 18-03-2014 -- Email ID : abc@domain.com Last Date : 18-02-2013 -- Email ID : abc@domain.com Last Date : 01-05-2012 

Один из способов – с Perl. Мы читаем фрагменты вашего ввода, установив разделитель входных данных на «-», как вы можете предположить. Мы переформатируем дату «День-месяц-год» в форму, которую мы можем численно сравнить; а именно YYYYMMDD. В общем и целом:

 #!/usr/bin/env perl use strict; use warnings; my @t = localtime(); my $today = sprintf( "%04d%02d%02d", $t[5] + 1900, $t[4] + 1, $t[3] ); local $/ = "--"; #...record separator... while (<>) { if (m{Last Date : (\d\d)-(\d\d)-(\d\d\d\d)}) { my $then = sprintf( "%04d%02d%02d", $3, $2, $1 ); print if ( $then < $today ); } } 1; 

Предполагая, что вы на самом деле сценарий «myfilter», вы можете выполнить, передав вам входные данные в программу или просто выполните:

 $ myfilter inputdata 

Не так элегантно, как решение Perl, но то же самое можно сделать с Awk по существу тем же алгоритмом:

 BEGIN{ FS = " : |\n" RS = "--\n?"; Padding = " 00 00 00"; Today = mktime(strftime("%Y %m %d") Padding); } { Last_date = gensub(/([0-9]{2})-([0-9]{2})-([0-9]{4})/, "\\3 \\2 \\1", "g", $4); if (mktime(Last_date Padding) < Today) { sub(/\n$/, "", $0); print Sep $0; Sep = "--\n" } } 

Вот еще одно решение perl :

 $ perl -MTime::Local -nle ' BEGIN { $/ = "--" } ($dd,$mm,$yy) = (localtime)[3..5]; $today = timelocal(0,0,0,$dd,$mm,$yy); $h{$1} = $_ if /Last Date : (.*)$/; END { print $h{$_} for grep { ($d,$m,$y)=split "-",$_; timelocal(0,0,0,$d,$m-1,$y) < $today; } keys %h }' file 

Здесь я использую timelocal() основного модуля Time::Local для преобразования даты в эпоху, она будет обрабатывать случай, когда дата ввода недействительна.