Tento converter uma string de carimbo de data/hora em tempo de época unix usando awk, mas falho após várias tentativas.
$ echo "2024-04-16 16:32:38.108580" | awk '{ epoch = mktime(gensub(/[:-]/, " ", "g", $1)) + substr($1, index($1, ".")+1) ; print epoch }'
2023
Você está operando,
$1
mas deveria estar operando$0
. Você teria visto isso se tivesse examinado as etapas intermediárias do seu comando. Você também tem um erro off-by-one.Isso deve funcionar:
Na verdade, apenas alterar
$0
e$1
corrigir o erro off-by-one em seu original funciona mesmo com a fração restante, mas não sei se esse comportamento é garantido:mktime()
está procurando a entrada do formatoYYYY MM DD HH MM SS
, então neste caso queremos:Podemos fazer isso de duas maneiras:
Como não designo um campo ou variável para operar nas funções, opere em toda a linha (ou seja,
$0
).O código do OP executa apenas operações no primeiro campo delimitado por espaço em branco (
$1
) que neste caso é2024-04-16
. O OP precisará designar os 2 primeiros campos ($1 " " $2
) ou a linha inteira ($0
- comportamento padrão se nenhum campo for designado).Como a entrada de amostra possui apenas 2 campos delimitados por espaços em branco, continuaremos processando a linha inteira (
$0
).Colocando essas alterações em um novo
awk
script:Se precisarmos acrescentar o
.108580
no final, podemos reutilizarsubstr( index() )
o código do OP, desde que nos lembremos de operar na linha inteira ($0
):