다음과 같이 서로 다른 날짜 형식을 포함하는 두 개의 파일이 있습니다.
파일 1:
2014-NOV-0620:59:59
파일 2:
2014-12-31
이 두 날짜를 awk에서 비교하는 방법은 무엇입니까?
답변1
펄은 정말 편리해요
use Time::Piece;
my $date1 = "2014-NOV-0620:59:59";
my $date2 = "2014-12-31";
my $datetime1 = Time::Piece->strptime($date1, "%Y-%b-%d%H:%M:%S");
my $datetime2 = Time::Piece->strptime($date2, "%Y-%m-%d");
if ($datetime1 < $datetime2) {
print "$date1 is earlier than $date2\n";
}
elsif ($datetime1 > $datetime2) {
print "$date1 is later than $date2\n";
}
else {
print "$date1 is equal to $date2\n";
}
GNU awk:
gawk '
function parse_date_fmt_1(date, epoch, regex, month) {
regex = "([[:digit:]]{4})-([[:alpha:]]{3})-([[:digit:]]{2})([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})"
if (match(date, regex, m)) {
month = index("..JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC", toupper(m[2])) / 3
epoch = mktime(m[1] " " month " " m[3] " " m[4] " " m[5] " " m[6])
}
return epoch
}
function parse_date_fmt_2(date, epoch, regex) {
regex = "([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})"
if (match(date, regex, m)) {
epoch = mktime(m[1] " " m[2] " " m[3] " 0 0 0")
}
return epoch
}
BEGIN {
date1 = "2014-NOV-0620:59:59"
print parse_date_fmt_1(date1)
date2 = "2014-12-31"
print parse_date_fmt_2(date2)
}
'
답변2
날짜와만 비교하기 위해 특정 날짜/시간을 지정하는 것은 문제가 있습니다. 지정된 날짜의 시간은 몇시입니까? 오늘의 첫 순간(자정)을 가정하겠습니다. 일반적인 아이디어는 UNIX 시대 이후의 초 수를 생성하는 것이므로 비교가 간단합니다.
d2=$( date -d "2014-12-31" "+%s" )
echo $d2
1420009200
#date cmd requires day-month-year order (if month is alpha) and proper case
fixed_date=$( echo $a | awk '{a=substr($0,0,11);b=substr($0,12,19);printf("%11s %8s\n",a,b)}' | awk '{a=tolower($0);print a}' | sed 's/[[:alpha:]]/\u&/' | awk 'BEGIN{FS="[- ]"};{print $3"-"$2"-"$1,$4}' )
d1=$( date -d "$fixed_date" "+%s" )
echo $d1
1415332799
#compare to confirm the time between dates
echo "($d2-$d1)/60/60/24" | bc -l
54.125...
#example - convert seconds back to a date
date -d @$d2 +"%Y-%m-%d %H:%M:%S"
2014-12-31 00:00:00