シェル スクリプトで AM と PM の時間を正しく減算するにはどうすればよいですか?

シェル スクリプトで AM と PM の時間を正しく減算するにはどうすればよいですか?

以下のスクリプトを使用して 01:00:00 AM と 23:00:00 PM を減算すると、わずか 2 時間であるのに 21 時間の差が生じるという状況に直面しています。

これが私のスクリプトです:

#!/bin/sh

Tm1=$(echo `date +%H:%M:%S`)
T1=`date -d "$Tm1" +%r`
X1=$(echo $T1 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')

Tm2=$(cat $DIR/session_$DATE.txt | awk '{print $5}' | head -1)
T2=`date -d "$Tm2" +%r`
X2=$(echo $T2 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')

diff=$(($X1-$X2))


TimeDifference=$(echo print $diff/3600. | python)
echo $TimeDifference

これを実現する方法はありますか? ご提案ください。

編集:

$DIR/セッション_$DATE.txt

これは、以下のような行を含む Netezza セッション ファイルです。以下では最初の行のみ表示しています。

26195 sql-odbc XXX  27-May-21 01:18:51 CDT

答え1

あなたのスクリプトには多くの間違いがあり、どこから始めればいいのか分かりません。私は「あなたはこれを必要以上に複雑にしすぎている」とだけ言います。

スクリプトを見ると、a) ログファイル内の日付と時刻と b) 現在との間の時間数を知りたいようです。したがって、次のようになります。

  1. 現在の日付と時刻をエポックからの秒数(*)形式で必要とします。

    X1="$(date +%s)"
    
  2. セッション ログ ファイルの最初の行から抽出された日付と時刻も、エポックからの秒数に変換する必要があります。

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. これら 2 つの日付の差 (X1-X2) を時間単位 (/3600) で計算する必要があります。

    let diff=(X1-X2)/3600
    

例:

#!/bin/bash

# get current time
X1="$(date +%s)"

# get the date, time, and timezone from the last 3 fields of the first line
logfile=session.txt
X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' "$logfile")" +%s)"

# calculate the difference in hours.  Note that bash arithmetic is integer only,
# so the result of the division is automatically rounded down.
let diff=(X1-X2)/3600

echo $diff

(*) 歴史的な理由により、「エポック」は 1970 年 1 月 1 日の午前 0 時と定義されています。「01-01-1970 00:00:00」。いつであるかは重要ではなく、秒数を使用して日付と時刻を計算するための便利な共通参照ポイントです。

関連情報