以下のように、課題提出日を含む2つの列があります。
NAME SUBMIT_TIME
Job1 Apr 25 11:30
Job2 Apr 25 16:30
現在の日付/時刻が60分以上異なる場合は、通知が必要です。
他の列の現在の日時との時差(分)を計算するのに役立ちます。
たとえば、現在の日付/時刻との時差を示す列が必要です。ジョブが 11:30 に実行され始め、現在は 13:30 であるため、120 分の差があるとします。
答え1
サポートされている時間バージョンがawk
有効で、欠落している年情報が現在の年であると仮定すると、次のことができます。
$ awk -F'[ :]' 'BEGIN{nowtime=systime();
mths="JanFebMarAprMayJunJulAugSepOctNovDec";
}
/[Jj]ob/ {$2=(match(mths,$2)+2)/3;
jobtime=mktime(2022" "$2" "$3" "$4" "$5" "0, 1);
print (nowtime-jobtime)/60;
}
' datafile
失われた年をハードコーディングするこのソリューションが、年の変更(コメント内のクエリに従って)が正しく処理されていないために満足できない場合は、年の形式を含めるようにジョブ送信日を含むデータファイルの形式を変更することいいですね。YYYY
。
注:
AwkにGNUバージョンの時間機能が搭載されている場合は、時間増分を計算するときに正規化されます。つまり、月や年を変更するときは、うるう年だけでなく、さまざまな長さの月も考慮することを意味します。これを行うには、以下を含む日付スタンプが付けられたジョブ送信データファイルが必要です。年情報最初。
編集する:
OP が追加の列に列形式の出力を要求し、時間が分単位で増加しました。修正されたコードは次のとおりです。
$ awk -F'[ :]' 'BEGIN{nowtime=systime(); mths="JanFebMarAprMayJunJulAugSepOctNovDec";}
NR==1 {printf "%s %s\n",$0,"DELTA(min)"}
/[Jj]ob/ {mo=(match(mths,$2)+2)/3;
jobtime=mktime(2022" "mo" "$3" "$4" "$5" "0, 1);
printf "%s %-4.1f\n",$0,(nowtime-jobtime)/60;
}
' datafile
NAME SUBMIT_TIME DELTA(min)
Job1 Apr 25 11:30 410.2
Job2 Apr 25 16:30 110.2
delta
提供されたサンプルデータファイルと(マイ)システム時間には視差()の数字が適用されます。
編集する:@EdMortonの提案に従って、ホストTZ設定がUTCタイムスタンプに対応すると仮定し、
UTC TZフラグを関数の2番目のパラメータ1
としてコードに統合しました。mktime()