今日の日付より前の「最終日」を持つレコードフォームベローズデータを見つける方法。つまり、今日の日付が2014年9月4日である場合、2014年9月4日より前の「最終日」を持つレコードを検索します。
-
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
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
_
ここでは、コアモジュール_Time::Local
_のtimelocal()
関数を使用して日付をエポックに変換します。入力日が有効な日付でない場合を処理します。