2つのテキストファイルがあります。最初のファイルには開始日時があり、2 番目のファイルには終了日時があります。
ファイル1データ(開始日時):
2019-01-08 04:14:59
2019-01-08 04:16:57
ファイル2データ(終了日時):
2019-01-08 04:15:50
2019-01-08 04:17:02
終了時間(開始時間のみ)で操作を実行するUnixスクリプトが必要です。実行する必要がある最初の項目の例:
04:15:50 - 04:14:59
結果を秒単位で提供します(この例では、合計差を秒単位で印刷する必要があります)。
答え1
次のクロスプラットフォームのコマンドラインユーティリティセットがあります。日付ツールこれにはdatediff
コマンドが含まれます。 Linuxを使用している場合は、dateutils
パッケージマネージャを使用してインストールした可能性が高くなります。
Linux、Mac、BSD、または他のUnixでこれをしたいかどうかを明示していないので、必要に応じて以下を調整する必要がありますが、Arch Linuxでは機能します。
$ paste start.txt end.txt | sed 's/ /T/g' | while read dates; do datediff $dates; done
51s
5s
説明する
パイプラインは、2つの部分、つまり差を計算するためにwhile read dates; do datediff $dates; done
入力を提供する部分と、生データを消費に適した形式で前処理する部分で構成されていると考えることができます。datediff
paste start.txt end.txt | sed 's/ /T/g'
datediff
具体的には、提供された入力例では、空白エスケープを心配する必要があります。データが元の形式のままである場合、datediff
ファイル内の各スペースは別々のパラメータを表すと見なされます。たとえば、以下は適切な入力ではありません。
$ paste start.txt end.txt
2019-01-08 04:14:59 2019-01-08 04:15:50
2019-01-08 04:16:57 2019-01-08 04:17:02
そのため、マニュアル()のいくつかの例と一致するようにsed
空白(タブではない)に置き換えました。T
datediff
man datediff
$ paste start.txt end.txt | sed 's/ /T/g'
2019-01-08T04:14:59 2019-01-08T04:15:50
2019-01-08T04:16:57 2019-01-08T04:17:02
データには予想されるパラメータの間にスペースがあり、各パラメータの形式はマニュアルで提供されている例と一致します。
答え2
bash
GNUを使用したソリューションdate
:
#!/bin/bash
while IFS= read -r -u3 line1; do
IFS= read -r -u4 line2
start_date="$line1"
end_date="$line2"
difference=$(( $(date -d "$end_date" "+%s") - $(date -d "$start_date" "+%s") ))
echo "Start Date: $start_date; End Date: $end_date; Difference in seconds = $difference"
done 3<start-times.txt 4<end-times.txt
ファイル記述子 3 と 4 は、両方のファイルから一度に 1 行ずつ読み取るために使用されます。ここでは、GNU dateコマンドを使用してそれをエポック時間に変換します。 Bashの算術拡張は、差を計算するために使用されます。
出力例:
Start Date: 2019-01-08 04:14:59; End Date: 2019-01-08 04:15:50; Difference in seconds = 51
Start Date: 2019-01-08 04:16:57; End Date: 2019-01-08 04:17:02; Difference in seconds = 5