Digamos que eu tenha millisecond=169920
que é igual a 00:02:49.92 (h:m:s:ms). Essa entrada está vindo de um arquivo de texto, um abaixo do outro.
Como posso converter esses milissegundos em tempo no Bash?
A maioria das perguntas pergunta sobre milissegundos para datas ou usa tempo de época, o que não é relevante aqui: eu preciso apenas de tempo, não de data.
exemplo de arquivo de texto com milissegundos:
cat milisecond.txt
169920
269320
163920
1339520
Como converter milissegundos em horas, minutos, segundos e milissegundos com
bash
e%
(operação de módulo)?Saída:
Aqui está uma função bash para converter milissegundos em tempo:
Pode ser isso que você está tentando fazer usando qualquer awk:
Isso será mais fácil de aprimorar e manter, será mais portátil e será ordens de magnitude mais rápido do que ler cada linha de entrada uma de cada vez e convertê-la com bash builtins, como suspeito que você provavelmente estava planejando fazer. Veja why-is-using-a-shell-loop-to-process-text-considered-bad-practice .
0. Preâmbulo
Esta resposta é baseada em
Com
time
limitado entre00:00:00
e23:59:59
!!Se você quiser uma resposta mais exaustiva, mostrando valores maiores que
86,400,000
milissegundos, você pode pular as três primeiras seções da minha resposta e ir diretamente para a seção 4. Ter horas não limitadas a "23(:59:59)" .1.
sed
poderia transformar rapidamente seus milsegundos em segundos:2.
printf
poderia transformar rapidamente segundos em tempo :Adicione
printf
o comando byTZ=UTC
para ignorar o deslocamento do fuso horário local.2.1. Alternativamente, usando arrays com
mapfile
e evitando loop :3.
printf
poderia definir uma variável:3.1. Construir array de tempos sem loop
4. Ter horas não limitadas a
"23(:59:59)"
4.1. O mesmo com a contagem de dias
4.2. Em uma função para definir uma variável de matriz
5. O mesmo sem loop
5.1. Em uma função para definir uma variável de matriz
Então
5.2. O mesmo com a contagem de dias
5.3. O mesmo sem qualquer fork ou loop
6. Pequeno loop de banco vs nenhum loop .
Um pequeno teste no meu sistema, com um arquivo de 32.805 linhas:
A função na seção 4.2 dura ~2,7 segundos usando loop , mas a função da seção 5.3 dura apenas ~1 segundo sem usar nenhum loop .
(Felizmente ambos os arrays são idênticos! ;)
Você pode usar
date
para isso:O truque é que você usa o horário após a época (1.1.1970 0:00:00). Importante é a opção
-u
para saída UTC. O formato%T
imprime apenas o horário.Aviso: Funciona apenas por <24 horas.