awkの行間のタイムスタンプの計算または合計

awkの行間のタイムスタンプの計算または合計

次の入力があります。

1. Track 01 05:21
2. Track 02 07:39   
3. Track 03 04:27

私は次のスクリプトを思いついた。

awk -F: '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}' file

しかし、私が得た結果は次のとおりです。

0:01:21
0:04:00
0:07:27

その結果、同じスクリプトを使用して時間だけが含まれ、他のものは含まれていないファイルがある場合は正しい出力が得られます。

入力する:

05:21
07:39
04:27

出力:

0:05:21
0:13:00
0:17:27

答え1

2つのawkコマンドを使用してください

awk '{print $NF}' file |awk '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}'

最初の awk はファイルの las フィールドを抽出し、2 番目の awk は目的のプロシージャを生成します。

時間が行の最後のフィールドである限り、ファイルに時間のみが含まれているかどうかに関係なく機能します。

答え2

問題は次のとおりです。 FS=":" 最初のフィールドが「1.Track 01 05」で、算術コンテキストでその文字列を使用すると、最初の数字以外の数字は切り捨てられます。したがって、分の値は「1」です。フィールド区切り文字としてスペースまたはコロンを使用する必要がありますが、後にスペースがある場合は追加の空のフィールドがあることを意味します。

やるよ

awk '
    BEGIN {h = m = s = 0}
    function add_time(min, sec) {
        s += sec
        m += min
        while (s >= 60) {s -= 60; m++}
        while (m >= 60) {m -= 60; h++}
    }
    {
        split($NF, t, /:/)
        add_time(t[1], t[2])
        printf "%d:%02d:%02d\n", h, m, s
    }
' file

関連情報