次のように、2つのファイル(起動済みと完了済み)があります。
スタートアップファイル:
2018-01-30 10:21:41
2018-01-17 12:22:50
2018-06-27 23:09:20
INVALID
INVALID
... for 800 Rows
完了したファイル:
2018-01-30 10:23:54
2018-01-17 13:23:45
2018-06-28 06:10:56
INVALID
INVALID
... for 800 rows
時間の経過を取得するには、file2とfile1の各行の違いの結果を含む3番目のファイルを作成する必要があります。
新しい3番目のファイル:
00:02:13
01:00:55
07:01:36
INVALID //Where any instance of invalid in either file remain in the new file.
INVALID
... 800行
このコマンドを使用して手動で動作させることができましたが、ファイルを繰り返す運はありませんでした。
string1="10:21:41"
string2="10:23:54"
StartDate=$(date -u -d "$string1" +"%s")
FinalDate=$(date -u -d "$string2" +"%s")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S"
> 00:02:13
ベストアンサー1
一行で
while read -r StartDate && read -r FinalDate <&3; do if [[ ${StartDate} != "INVALID" && ${FinalDate} != "INVALID" ]]; then diff=$(expr $(date -d "${FinalDate}" +"%s") - $(date -d "${StartDate}" +"%s")); printf '%dd:%dh:%dm:%ds\n' $((${diff}/86400)) $((${diff}%86400/3600)) $((${diff}%3600/60)) $((${diff}%60));else echo INVALID; fi; done < startedfile 3<finishedfile
スクリプトとして
#!/bin/bash
while read -r StartDate && read -r FinalDate <&3; do
if [[ ${StartDate} != "INVALID" && ${FinalDate} != "INVALID" ]]; then
diff=$(expr $(date -d "${FinalDate}" +"%s") - $(date -d "${StartDate}" +"%s"));
printf '%dd:%dh:%dm:%ds\n' $((${diff}/86400)) $((${diff}%86400/3600)) $((${diff}%3600/60)) $((${diff}%60));
else
echo INVALID;
fi;
done < startedfile 3<finishedfile
次の出力が提供されます。
0d:0h:2m:13s
0d:1h:0m:55s
INVALID
0d:7h:1m:36s
INVALID
INVALID
その後、必要なファイルに出力できます。
編集する
説明に示されているようにdateutils
パッケージをインストールしてdatediff
コマンドを使用すると、この作業を簡素化できます。
while read -r StartDate && read -r FinalDate <&3; do if [[ ${StartDate} != "INVALID" && ${FinalDate} != "INVALID" ]]; then datediff "${StartDate}" "${FinalDate}" -f "%dd:%Hh:%Mm:%Ss";else echo INVALID; fi; done < started.txt 3<finished.txt
スクリプトから
#!/bin/bash
while read -r StartDate && read -r FinalDate <&3; do
if [[ ${StartDate} != "INVALID" && ${FinalDate} != "INVALID" ]]; then
datediff "${StartDate}" "${FinalDate}" -f "%dd:%Hh:%Mm:%Ss";
else
echo INVALID;
fi;
done < startedfile 3<finishedfile