Eu tenho um arquivo de texto com as seguintes datas no formato dd/mm/yyyy
:
14/09/1992
15/04/1983
15/09/1961
02/06/1979
14/12/1971
08/02/2001
19/06/1999
14/09/1969
31/08/2002
30/07/1980
25/04/1973
03/01/1992
Eu quero converter isso no YYYY/mm/dd
formato em um script. Eu estava planejando usar o comando date para fazer isso:
date -f tempDate +%Y/%m/%d
mas o fato é que ele não reconhece as datas no estilo inglês e mostra o seguinte erro, pois acredito que esteja lendo como mm/dd/yyyy
quando eu não quero:
date: invalid date `14/09/1992"
existe outra maneira de fazer isso? ou há uma maneira de alterar a ordem do formato da data?
Além disso, preciso que esse script funcione em um servidor do qual não sou administrador de sistema.
Respostas:
3 para resposta № 1Se o arquivo é como descrito, por que não inverter as colunas com awk
:
$ awk "BEGIN{FS=OFS="/"}{print $3,$2,$1}" file
1992/09/14
1983/04/15
1961/09/15
1979/06/02
1971/12/14
2001/02/08
1999/06/19
1969/09/14
2002/08/31
1980/07/30
1973/04/25
1992/01/03
Editar:
Tão fácil em awk
com separador de vários campos:
$ awk -F[/,] "{print $1","$2","$5"/"$4"/"$3}" <<< "name,number,14/09/1992"
name,number,1992/09/14
4 para resposta № 2
Você pode usar um script awk rápido para mudar para a ordem ano / mês / dia:
awk -F "/" "{print $3"/"$2"/"$1}" < file.txt
2 para resposta № 3
No Mac OS X, pelo menos, o -f
opção até o momento está documentada como:
-f
Use input_fmt como a string de formato para analisar new_date fornecido em vez de usar o padrão[[[mm]dd]HH]MM[[cc]yy][.ss]
formato. A análise é feita usandostrptime(3)
.
Portanto, você deve usar:
date -f "%d/%m/%Y" +"%Y-%m-%d" ...
No entanto, o problema residual é converter vários valores; você precisaria de várias invocações de date
para isso, então você "gostaria de tentar algo como:
# Bogus code
while read date # Bogus code
do date -f "%d/%m/%Y" $date +"%Y-%m-%d" # Bogus code
done < tempDate # Bogus code
# Bogus code
Isso, no entanto, tenta definir o relógio do sistema (não com muito sucesso, a menos que você esteja root
no momento, e você não deveria ser root
ao experimentar). Portanto, não há uma maneira óbvia de obter date
comando para fazer o que quiser.
Portanto, as respostas usando awk
, sed
, perl
, python
e expressões regulares para mapear as datas são o caminho a percorrer.
1 para resposta № 4
O formato de data padrão internacional, ISO 8601, é YYYY-MM-DD
, não YYYY/MM/DD
. Eu sugiro usar isso, a menos que você tenha um bom motivo para não o fazer.
Os formatos de data dos EUA e do Reino Unido são ambíguos para datas antes do dia 13 de cada mês, portanto, não é surpreendente que date
não reconheceria. Pode haver uma maneira de dizer que uma determinada string está no formato do Reino Unido, mas eu não sei o que é.
Você pode usar sed
, ou qualquer outra ferramenta que faça a substituição de expressões regulares, para alterar o formato:
$ echo 14/09/1992 | sed "s/([0-9][0-9])/([0-9][0-9])/([0-9][0-9][0-9][0-9])/3-2-1/"
1992-09-14
Perl pode fazer isso com um pouco menos de verbosidade:
$ echo 14/09/1992 | perl -pe "s/(dd)/(dd)/(dddd)/$3-$2-$1/"
1992-09-14
ou:
$ echo 14/09/1992 | perl -pe "s/(d{2})/(d{2})/(d{4})/$3-$2-$1/"
1992-09-14
0 para a resposta № 5
Se estiver usando o Windows, você também pode alterar suas configurações regionais para alterar o formato de data em seu computador como um todo e, em particular, em seu arquivo .csv:
Win7:
1. / Vá para o botão Iniciar 2. / Escolha o painel de controle 3. / Relógio, idioma e região. 4. / Altere o formato de data, hora e número.