web-dev-qa-db-ja.com

今日より前の日付のレコードを検索する

今日の日付より前の「最終日」を持つレコードフォームベローズデータを見つける方法。つまり、今日の日付が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
Daya

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
JRFerguson

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"
    } 
}
1
user61786

別の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()関数を使用して日付をエポックに変換します。入力日が有効な日付でない場合を処理します。

0
cuonglm