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

как найти рекордные данные о сильфонах с «Последней датой» до сегодняшней даты. т.е.: если сегодня дата 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 

3 Solutions collect form web for “Найти записи, представленные до сегодняшнего дня”

Один из способов – с 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 для преобразования даты в эпоху, она будет обрабатывать случай, когда дата ввода недействительна.

  • получить X-й аргумент в каждой строке
  • как добавить вывод в виде нового столбца с именами файлов
  • объединить текстовые файлы по столбцам
  • фильтрация данных на основе разделителя в оболочке
  • Объединение различных полей с разным разделителем
  • Обрезать текст без цикла
  • Как заменить временные метки эпохи в файле другими форматами?
  • Прочитать текстовые строки между двумя строками
  • Как сравнить различные команды обработки текста и узнать наиболее быстрый?
  • Транспонирование нескольких столбцов - это строка
  • Как заменить текст в столбце
  • Linux и Unix - лучшая ОС в мире.