Unixシェルスクリプト - 2つの.txtファイルから結果を抽出する(時間操作)

Unixシェルスクリプト - 2つの.txtファイルから結果を抽出する(時間操作)

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入力を提供する部分と、生データを消費に適した形式で前処理する部分で構成されていると考えることができます。datediffpaste 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空白(タブではない)に置き換えました。Tdatediffman 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

bashGNUを使用したソリューション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

関連情報