查找今天之前的记录

查找今天之前的记录

如何查找记录表单中“最后日期”早于今天日期的数据。即:如果今天的日期是 09-04-2014,则查找“最后日期”早于 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

预期输出将是:

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

答案1

一种方法是使用 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

答案2

不像 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"
    } 
}

答案3

这是另一个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将日期转换为纪元,它将处理输入日期不是有效日期的情况。

相关内容