awk を使用して列から日付を減算するにはどうすればよいでしょうか?

awk を使用して列から日付を減算するにはどうすればよいでしょうか?

次のような 3 つの列があります。

18:37:12 18:37:31 0  
18:37:01 18:37:18 0

次のように、最初の 2 つの列の秒数の差を 3 番目の列に入力したいと思います。

18:37:12 18:37:31 19  
18:37:01 18:37:18 17

私はこれを使用しています:

nova migration-list | grep completed | awk '{ print substr($22,12,8), substr($24,12,8) }' | awk 'BEGIN{ FS=" " } { print $0, $2-$1 }'

ご協力いただければ幸いです

答え1

GNU システムの場合:

awk '{"date -d "$1" +%s"|getline one; "date -d "$2" +%s"|getline two; \
         print $1, $2, two-one}' file.txt
  • "date -d "$1" +%s"|getline oneフィールド1のエポックからの秒数を取得し(GNUを使用date)、変数に保存します。one

  • "date -d "$2" +%s"|getline twoフィールド2に対しても同じことを行い、結果を変数として保存します。two

  • print $1, $2, two-oneフィールド1、2、および変数2と1の減算を出力します。

例:

% cat file.txt
18:37:12 18:37:31 0
18:37:01 18:37:18 0

% awk '{"date -d "$1" +%s"|getline one; "date -d "$2" +%s"|getline two; print $1, $2, two-one}' file.txt
18:37:12 18:37:31 19
18:37:01 18:37:18 17

答え2

GNU awk の組み込み時間関数を使用する:

awk '
  function to_time(time,   t,a) {
    split(time, a, ":")
    t = mktime("1970 1 1 " a[1] " " a[2] " " a[3])
    return t
  }
  {print $1, $2, to_time($2) - to_time($1)}
' file

関連情報