"마지막 날짜"가 오늘 날짜보다 빠른 레코드 형식의 데이터를 찾는 방법입니다. 즉, 오늘 날짜가 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