/ / Bash - Data que não reconhece o formato do Reino Unido (dd / mm / aaaa) - bash, data, formato

Bash - Data que não reconhece o formato do Reino Unido (dd / mm / aaaa) - bash, data, formato

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 № 1

Se 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 usando strptime(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.