Encontre registros datados antes de hoje

1

como encontrar dados de foles de formulário de registro com "Última data" antes da data de hoje. ou seja: se a data de hoje for 09-04-2014, em seguida, encontrar um registro com "Última data" antes de 09-04-2014

-

Email ID : [email protected] 
Last Date : 30-04-2014
--
Email ID : [email protected] 
Last Date : 18-03-2014
--
Email ID : [email protected] 
Last Date : 18-02-2013
--
Email ID : [email protected] 
Last Date : 18-05-2015
--
Email ID : [email protected] 
Last Date : 01-05-2012
--
Email ID : [email protected] 
Last Date : 09-04-2014

A saída esperada será:

Email ID : [email protected] 
Last Date : 18-03-2014
--
Email ID : [email protected] 
Last Date : 18-02-2013
--
Email ID : [email protected] 
Last Date : 01-05-2012
    
por Daya 10.04.2014 / 12:21

3 respostas

2

Uma maneira é com o Perl. Nós lemos pedaços de sua entrada tendo definido o separador de registro de entrada como "-", como você sugere. Reformatamos a data do seu dia-mês-ano em um formulário que podemos comparar numérica e relacionalmente; viz. AAAAMMDD. Geral:

#!/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;

Assumindo que você não tem o script 'myfilter', você pode executar canalizando dados de entrada para o programa ou simplesmente fazendo:

$ myfilter inputdata
    
por 10.04.2014 / 14:46
1

Não é tão elegante quanto a solução Perl, mas o mesmo pode ser feito com o Awk, essencialmente com o mesmo algoritmo:

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"
    } 
}
    
por 14.04.2014 / 05:46
0

Aqui está outra solução 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

Aqui eu uso a função timelocal() do módulo de núcleo Time::Local para converter a data em época, ele manipulará o caso quando a data de entrada não for uma data válida.

    
por 14.04.2014 / 09:21