Converter carimbo de data / hora unix em hh: mm: ss: SSS (em que SSS é milissegundos) em AWK

1

Como posso converter o carimbo de data / hora unix para hh: mm: ss: SSS (em que SSS é milissegundos) no AWK.

Por exemplo:

echo 1456478048306 > time
cat time | awk ....... > readable_time_format
    
por Abubakar Siddique 26.02.2016 / 10:53

2 respostas

5

Com o 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'

com BSD date :

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

Com GNU awk e versões recentes de mawk (desde 1.3.4 20121129 ):

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

Para portabilidade, perl pode ser sua melhor aposta:

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

Aqui, dou o meu formato preferido mais convencional e menos ambíguo:

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

mas é claro, você pode ajustar o formato strftime de acordo com sua preferência.

    
por 26.02.2016 / 11:34
1

Se você não se preocupa com fusos horários e segundos bissextos, e por alguma razão seu awk não suporta strftime , você pode calcular diretamente:

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); }'
    
por 26.02.2016 / 12:40