web-dev-qa-db-ja.com

UNIXタイムスタンプをAWKでhh:mm:ss:SSS(SSSはミリ秒)に変換します

UNIXタイムスタンプをAWKでhh:mm:ss:SSS(SSSはミリ秒)に変換するにはどうすればよいですか。

例えば:

echo 1456478048306 > time
cat time | awk ....... > readable_time_format
1

GNU date

d=1456478048306
s=${d%???}
ms=${d#"$s"}

date -d "@$s" +"%F %T.$ms %z"
# or:
date -d "$s.$ms" '+%F %T.%3N %z'

BSDの場合date

date -r "$s" +"%F %T.$ms %z"

GNU awkおよび最近のバージョンのmawk1.3.4 20121129):

echo 1456478048306 | awk '{
  print strftime("%F %T." substr($0,length-2) " %z", substr($0, 1, length-3))}'

移植性のために、Perlが最善の策かもしれません:

echo 1456478048306 | Perl -MPOSIX -lne '
  print strftime "%F %T.$2 %z", localtime $1 if /(.+)(.{3})/'

ここで、私の好みのより従来型で曖昧さの少ない形式を示します。

2016-02-26 09:14:08.306 +0000

もちろん、strftime形式は好みに合わせて調整できます。

5

タイムゾーンとうるう秒に関心がなく、何らかの理由でawkがstrftimeをサポートしていない場合は、直接計算できます。

awk '{ t=$1;sss=(t % 1000); t/=1000; ss=(t%60); t/=60; mm=(t%60);
  t/=60; hh=(t%24); printf("%02d:%02d:%02d.%03d\n",hh,mm,ss,sss); }'
1
Otheus