如何在 AWK 中将 unix 时间戳转换为 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"
使用 GNUawk
和最新版本mawk
(自1.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
根据自己的喜好调整格式。
答案2
如果您不关心时区和闰秒,并且由于某种原因您的 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); }'