Tenho milhões de linhas de dados que meu chefe me pediu para reformatar para eles.
O formato é:
06/28/2022,04:00,142.01,142.38,141.59,142.15,3151
06/28/2022,04:01,142.1,142.1,142.1,142.1,196
Eu preciso reformatar o primeiro campo de data para:
20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196
%Y%m%d
Eu tenho o seguinte:
gawk -F"," '{OFS=","; $1=strftime("%Y%m%d", $1); print $0}' AAPL.txt > AAPL.csv
mas o estranho é que funciona, mas produz uma data em 1969.
19691231,04:00,142.01,142.38,141.59,142.15,3151
19691231,04:01,142.1,142.1,142.1,142.1,196
Eu não entendo por quê. Eu escolhi gawk
porque awk
no MacOS não tem strftime
e chamar date
externamente cria um grande impacto no desempenho.
Seu código não faz o que você espera porque o GNU
awk
strftime()
espera um timestamp Unix como seu segundo argumento. Não é possível analisar uma string de data e hora arbitrária.No entanto, nós realmente não precisamos
strftime()
aqui.Isso trata cada linha de entrada como campos simples delimitados por vírgulas e divide o primeiro desses campos no
/
arraya
. O primeiro campo é então reformado como os elementos do array concatenados na ordem desejada.O solitário
1
no final doawk
código faz com que o registro modificado seja gerado.Isso funcionaria com o padrão
awk
no macOS. Ele não precisa de funções especiais de formatação de data, pois trata a data de entrada como uma string e a reorganiza de maneira simples. A única suposição sobre a data é que ela sempre está noDD/MM/YYYY
formato na entrada e que deve estar noYYYYMMDD
formato na saída.Você não precisa de funções como
strftime
manipulação de datas, pois tudo o que você precisa fazer é trocar os campos.sed
funciona bem aqui: