3

これが私の場合です。

bash ~]# TIME="2012-05-25 06:42:57"
bash ~]# echo "2012-05-25 00:16:51,610" | awk -v var=$TIME '{if ($0 < var) print $0}'

次に、ここにエラーメッセージがあります

awk: 06:42:57
awk:   ^ syntax error

awk コマンドに日付範囲を渡したいだけです。これをアーカイブする方法は?助けてください。ありがとう。

ケースを修正する

START_TIME="2012-05-24 00:00:00"
END_TIME="2012-05-24 01:00:00"
echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 > START && $0 < END) print $0 }'

IF条件では機能していないようです。

awk: { if ( $0 < START && $0 > END) print $0 }
awk:                           ^ syntax error

サーバルが試した後、別のアプローチで解決策を見つけたようです。

echo "2012-05-24 00:10:10" | awk '{ if ( $0 > "'"$START_TIME"'" && $0 < "'"$END_TIME"'" ) print $0 }'

awk変数「-v」でそれを行う方法がわかりません。誰にもアイデアがありますか?

4

2 に答える 2

7

変数を AWK に渡すときに引用符で囲みます。

echo "2012-05-25 00:16:51,610" | awk -v "var=$TIME" '{if ($0 < var) print $0}'
于 2012-05-25T16:32:27.023 に答える
1

少なくとも私のシステムでは、「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 を評価しようとしているようです。時間が循環しているという理論がなければ、この論理には欠陥があると推測できると思います。

だからここに私が思いついたものがあります。これはgawkmktime()関数を使用するため、どこでも機能しないことに注意してください。

[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()明らかに、これは、日付/時刻の指定が の入力形式と非常によく一致するという事実に完全に依存しています。ただし、質問のサンプルデータでは機能します。

于 2012-05-26T04:51:30.077 に答える