bashを使用して時間の合計を計算する方法は?

bashを使用して時間の合計を計算する方法は?

一連のプロセスを自分のコンピュータで実行するのか、より強力なコンピュータで実行するのかを判断するのにかかる合計時間を知りたいのです。したがって、各命令の実行時間を予測する。出力は次のとおりです。

process1    00:03:34
process2    00:00:35
process3    00:12:34

合計実行時間を取得するために2番目の列をどのように合計できますか?各行を挿入してみることができます。

awk '{sum += $2 } END { print sum }

しかし、これはその値が自然数ではないため意味がありません。

答え1

#!/bin/sh

EPOCH='jan 1 1970'
sum=0

for i in 00:03:34 00:00:35 00:12:34
do
  sum="$(date -u -d "$EPOCH $i" +%s) + $sum"
done
echo $sum|bc

date -u -d "jan 1 1970" +%s0を与える。するとdate -u -d "jan 1 1970 00:03:34" +%s214秒になります。

答え2

これを使用できない場合や使用したくない場合は、TIMEFORMAT時間を秒に変換してから一緒に追加します。たとえば、パイプを介した出力は次のようになります。

{                                           
sum=0
while IFS="[ :]" proc_name h m s
do
    let sum+=$((60*($m+60*$h)+$s)) 
done 
echo $sum  
} 

あるいは、必要に応じて、最後のechoコマンドを次のように置き換えることもできます。

printf "%02d:%02d:%02d\n" $[sum/3600] $[sum/60] $[sum%60]

答え3

修正する:

これはdc。合計が60時間を超えると、次のように出力されます。4つ3つ以外のスペースで区切られた値。 (合計が1時間未満の場合、スペースで区切られた2つの値のみが出力されます。)

awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'

質問に示すように、入力が時、分、秒の3回であるとします。

提供される入力の出力は次のとおりです。

 16 43

元の答え:

dcデスクトップ電卓を使ってこれを行いましょう。これはPythonのバックエンドであり、bcしばしば神秘的であると考えられていますが、非常に柔軟です。


まず、いくつかの前処理によって時間だけを提供し、コロンを空白に変換します。

awk '{print $2}' | tr : ' '

Sedを使用してこれを実行することもできます。

sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'

trAwkがより簡単なので、Awkを選択します。上記のコマンドの1つは、次の形式できちんとした出力を生成します。 (もっと面白いと思うので、私のサンプルテキストを使用しました。これには時間も含まれています。サンプルテキストも機能します。)

$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18

上記の形式で与えられた時間を次のSedスクリプトで実行し、次のようにdc結果をパイプします。

sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc

(サイドスクロールを減らすために分類しました:)

sed <input \
    -e '1s/^/0 /' \
    -e 's/$/ r 60 * + r 60 60 * * + +/' \
    -e '$s/$/ 60 60 * ~ 60 ~ f/' |
      dc 

出力は秒、分、時間順に表示されます。 (参考までにこの順序は逆順です。) 学んでいるのでdc完璧な解決策ではありませんが、しかし、一見するとかなり大丈夫に見えると思いますdc

端末から直接貼り付けた入力と出力の例:

$ cat input 
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
$ sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc 
16
55
42
$ 

答え4

私の解決策は次のとおりです。split().: を使用して合計時間を秒単位で印刷します。

awk '{
        split($2, tm, ":");
        tottm += tm[3] + tm[2] * 60 + tm[1] * 3600;
    }
    END {
        print tottm;
    }' ptime

適切な時間形式で印刷してください。

awk '{
        split($2, tm, ":");
        secs += tm[3]; 
        mins += tm[2] + int(secs / 60); 
        hrs += tm[1] + int(mins / 60);
        secs %= 60; mins %= 60;
    }
    END {
        printf "%d:%d:%d\n", hrs, mins, secs;
    }' ptime

GNU awkもstrftimeをサポートしていますが、現在のタイムゾーンを使用しているため、結果は混乱します。

関連情報