Esta solução usa um script awk para converter as datas no primeiro arquivo para o número de segundos desde a época e preprende este número para a saída. Usamos date +%s --date
para fazer o trabalho pesado e capturar a saída do comando na variável awk secs
chamando a função getline
do awk. (A sintaxe do awk é: comando | getline
variável ).
awk <log1 >log1.new '
{ y = substr($0,3,4); m = $2; d = $3; hms = substr($0,15,8)
"date \"+%s\" --date \"" d " " m " " y " " hms "\"" | getline secs
print secs " " $0
}'
Um segundo script awk faz o mesmo para o segundo arquivo, mas apenas para a primeira linha com o registro de data e hora, que é salvo na variável awk base
. Nas outras linhas, simplesmente adicionamos o deslocamento de minutos e segundos a essa base e usamos date
para converter os segundos desde a época em uma data real, no formato do primeiro arquivo.
awk <log2 >log2.new '
/^Timestamp/{ split($5,x,":"); dmy = sprintf("%04d/%02d/%02d",x[3],x[2],x[1])
split($3,x,":"); hms = sprintf("%02d:%02d:%02d",x[1],x[2],x[3])
"date \"+%s\" --date \"" dmy " " hms "\"" | getline base
}
/^\[/ { mins = substr($0,2,2); secs = substr($0,5,2);
tot = base + mins*60+secs
"date \"+%Y %b %d %H:%M:%S\" --date @" tot | getline date
print tot " -:" date " " substr($0,8)
}'
Os dois arquivos são então mesclados por uma classificação no campo numérico, e finalmente o número é removido por um sed.
sort -m -n -k1,1 log1.new log2.new |
sed 's/^[^ ]* //'