Para nomes de arquivos como este:
fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt
O que estou tentando fazer awk
é isolar o nome do arquivo .xml
e, em seguida, isolar e formatar o carimbo de data/hora para uso em um csv/banco de dados.
Eu tenho o seguinte:
NR==1 {
fn=substr(FILENAME, 0, FILENAME-5);
ts=fn;
sub(/[0-9]{4}.*$/,"",fn);
sub(/^\w+\.xml/,"",ts);
} {
printf "fn\tts"
}
Posso retirar o '-' do final, mas depois disso não consigo descobrir como converter o timestamp restante para ser formatado como 2017-11-30 21:00:59
.
Isso funciona, embora eu pessoalmente não use o awk para isso, eu usaria o gawk, que possui alguns recursos significativos que facilitam essa operação de tipo exato, gensub ().
Como você especificou o awk, esta é uma maneira de fazer isso, embora um pouco básica.
Observe que, devido à ausência de gensub, transferi o valor de $ 0 para dois detentores, para poder remover o início de um e o final do outro.
Como você pode ver, é fácil remover os iniciadores / finalizadores iniciais, e isso deixa apenas os dados de data / hora para processamento posterior.
Usando gawk e gensub é mais fácil.
Observe que os padrões de início/fim fazem a mesma coisa, um pega o padrão real e o reproduz, o segundo apenas diz, dê-me as primeiras 10 correspondências para [0-9-] e as últimas 8 correspondências para [0-9_] , depende apenas do que é mais fácil de ler.
A verdadeira questão é se você não teria se saído melhor usando Perl para este trabalho.