Usando o awk para quebrar um timestamp e formatá-lo

0

Para nomes de arquivo 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 realizar com awk é isolar o nome do arquivo por .xml e, em seguida, isolar e formatar o registro de data e 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"
}

Eu posso remover o '-' do final, mas depois disso, não consigo descobrir como no awk converter o carimbo de data / hora restante para ser formatado como 2017-11-30 21:00:59 .

    
por Noah Goodrich 21.12.2017 / 19:03

1 resposta

2

Isso funciona, embora eu não usasse o awk para isso, eu usaria o gawk, que tem alguns recursos significativos que facilitam a operação desse tipo, gensub () ..

echo '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' | awk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  date=$0; 
  time=$0; 
  sub(/[-_][0-9]{2}_[0-9]{2}_[0-9]{2}$/,"",date); 
  sub(/^[0-9]{4}-[0-9]{2}-[0-9]{2}[-_]/,"",time);
  gsub(/_/,":",time);
  print date " "  time 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

Desde que você especificou awk, esta é uma maneira de fazer isso, embora um pouco básica.

Note que, devido à ausência do gensub, eu transferi o valor de $ 0 para dois titulares, para que eu pudesse retirar o começo de um e o fim do outro.

Remover as iniciais / finais iniciais é fácil, como você pode ver, e isso deixa apenas os dados de data / hora para processar ainda mais.

Usar o gawk e o gensub é mais fácil.

echo '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' | gawk '{
  gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
  datetime = gensub(/^([0-9-]{10})[-_]([0-9_]{8})$/,"\1 \2",1,$0);
  gsub(/_/,":",datetime);
  print datetime 
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59

Note que os padrões de início / fim fazem a mesma coisa, um pega o padrão atual e o reproduz, o segundo apenas diz, dá-me as 10 primeiras correspondências para [0-9-] e as últimas 8 combinações para [0 -9_], depende apenas de qual é mais fácil de ler.

A verdadeira questão é se você não teria sido melhor usar o Perl para esse trabalho, no entanto.

    
por 21.12.2017 / 21:20