2つのファイルデータ間の日付/時刻差の計算

2つのファイルデータ間の日付/時刻差の計算

File1とFile2という2つのファイルがあります。 File1のデータは次のとおりです。

"Start Date & Time" = 1804030000

そしてFile2のデータは次のとおりです。

"End Date & Time" = 1804030400

両方のファイルには同じ数の行(ほぼ300,000行)があります。これで、終了日時(ファイル2) - 開始日時(ファイル1)を減算して視差を計算し、結果を新しいファイルに1行ずつ保存しようとしています。

両方のファイルの日付と時刻の形式は (yymmddhhmm) です。

答え1

小さな実行可能ファイルbusybox:-Dオプションを使用して日付形式を解析できます。
ファイル日付の形式は次のとおりです。%y%m%d%H%M

$ busybox date -uD %y%m%d%H%M -d "1804040400"
Wed Apr  4 04:00:00 UTC 2018

awkでこれを使用してください:

$ awk 'BEGIN{  a="busybox date -uD %y%m%d%H%M +%s -d " }
         { b=a $6  ; b | getline sd ; close(b)
           b=a $NF ; b | getline ed ; close(b)
           print(ed,sd,ed-sd)
         }' < <(paste infile[12])

1522814400 1522713600 100800

注:この-uオプションを使用すると、一部のDSTやローカルの影響を回避できます。ほとんどの場合、2 つの日付コマンドが同じ環境 TZ で実行されるため、最終差は変更されません。

答え2

私はandを使用しawkて最初に有効なものに変換します。Start Date & TimeEnd Date & Time日付このdateコマンドはこの形式を理解し、yymmdd HH:mmそれぞれを次に変換します。連帯差を計算する時間第二

$ awk '{endDateInEpoch="date -d""\""substr($NF,1,6)" "substr($NF,7,2)":"substr($NF,9,2)"\""" +%s";
        endDateInEpoch |getline endDateInEpoch;close(endDateInEpoch); 

        startDateInEpoch="date -d""\""substr($6,1,6)" "substr($6,7,2)":"substr($6,9,2)"\""" +%s";
        startDateInEpoch |getline startDateInEpoch;close(startDateInEpoch);

        sec=endDateInEpoch-startDateInEpoch; sec*=(sec)?1:-1; print sec" seconds"
}' <(paste file[12])
100800 seconds

まずpaste file[12]、両方を貼り付けました。ファイル1そしてファイル2結果は並べて次のようawkに入力に渡され、次の最後の$NFフィールドを指します。1804040400終了日時フィールド#18040300006開始日時awkデフォルトのスペースをフィールド区切り文字として使用します。FS F生産するSイテレータ:

"Start Date & Time" = 1804030000        "End Date & Time" = 1804040400

関連情報