sed/awk を使用した視差の計算

sed/awk を使用した視差の計算

以下のように、課題提出日を含む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()

おすすめ記事