如何查找记录表单中“最后日期”早于今天日期的数据。即:如果今天的日期是 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
将日期转换为纪元,它将处理输入日期不是有效日期的情况。