오늘 이전의 기록 찾기

오늘 이전의 기록 찾기

"마지막 날짜"가 오늘 날짜보다 빠른 레코드 형식의 데이터를 찾는 방법입니다. 즉, 오늘 날짜가 2014년 9월 4일인 경우 "마지막 날짜"가 2014년 4월 9일 이전인 레코드를 찾습니다.

-

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()핵심 모듈의 기능을 사용하여 날짜를 epoch로 변환하고 있습니다.Time::Local

관련 정보