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 & Time
End 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
終了日時フィールド#1804030000
6開始日時awk
デフォルトのスペースをフィールド区切り文字として使用します。FS
F生産するSイテレータ:
"Start Date & Time" = 1804030000 "End Date & Time" = 1804040400