少なくとも私のシステムでは、「END」は変数の予約語であるようです。Awk は BEGIN を使用するのと同じように END を使用しますが、それを変数として使用する試みはこれまで見たことがありません。ノート:
[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 < START && $0 > END) print $0 }'
awk: syntax error at source line 1
context is
{ if ( $0 < START && $0 > >>> END <<< ) print $0 }
awk: illegal statement at source line 1
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v s_time="$START_TIME" -v e_time="$END_TIME" '{ if ( $0 < s_time && $0 > e_time) print $0 }'
[ghoti@pc ~]$
明らかにこれはまだ機能していませんが、予約語を変数として使用しようとしているからではなく、比較がどのように機能するかについて誤解しているため、機能していません。
ステートメントを見るとif
、比較文字列が開始日の BEFORE と終了日の後の両方である場合にのみ TRUE を評価しようとしているようです。時間が循環しているという理論がなければ、この論理には欠陥があると推測できると思います。
だからここに私が思いついたものがあります。これはgawk
のmktime()
関数を使用するため、どこでも機能しないことに注意してください。
[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ printf '2012-05-23 22:10:10\n2012-05-24 00:10:10\n2012-05-24 01:10:10\n' | gawk -v s_time="$START_TIME" -v e_time="$END_TIME" 'BEGIN { s=mktime(gensub(/[^0-9]/," ","G",s_time)); e=mktime(gensub(/[^0-9]/," ","G",e_time)); } { now=mktime(gensub(/[^0-9]/," ","G")); if ( now > s && now < e) print $0 }'
2012-05-24 00:10:10
[ghoti@pc ~]$
読みやすいようにスペースを空けて、gawk スクリプトは次のようになります。
BEGIN {
s=mktime(gensub(/[^0-9]/," ","G",s_time));
e=mktime(gensub(/[^0-9]/," ","G",e_time));
}
{
now=mktime(gensub(/[^0-9]/," ","G"));
if ( now > s && now < e) print $0;
}
mktime()
明らかに、これは、日付/時刻の指定が の入力形式と非常によく一致するという事実に完全に依存しています。ただし、質問のサンプルデータでは機能します。