/ / Bash - Dátum nerozpoznávajúci formát Spojeného kráľovstva (dd / mm / rrrr) - bash, dátum, formát

Bash - Dátum neznáša formát vo Veľkej Británii (dd / mm / rrrr) - bash, dátum, formát

Mám textový súbor s nasledujúcimi dátumami vo formáte 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

Chcem to previesť na YYYY/mm/dd formát v skripte. Mal som v pláne použiť na to príkaz date:

date -f tempDate +%Y/%m/%d

ale je to tak, že nerozpoznáva dátumy v anglickom štýle a zobrazuje nasledujúcu chybu, pretože sa domnievam, že ju číta ako mm/dd/yyyy keď to nechcem:

date: invalid date `14/09/1992"

existuje iný spôsob, ako to urobiť? alebo existuje spôsob, ako môžem zmeniť poradie formátu dátumu?

tiež potrebujem, aby tento skript fungoval na serveri, pre ktorý nie som sysadmin.

odpovede:

3 pre odpoveď č. 1

Ak je súbor opísaný, prečo nielen obrátiť stĺpce pomocou 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

edit:

Rovnako ľahké v awk s oddeľovačom viacerých polí:

$ awk -F[/,] "{print $1","$2","$5"/"$4"/"$3}" <<< "name,number,14/09/1992"
name,number,1992/09/14

4 pre odpoveď č. 2

Na prechod na rok / mesiac / deň môžete použiť rýchly skript awk:

 awk -F "/" "{print $3"/"$2"/"$1}" < file.txt

2 pre odpoveď č. 3

Minimálne v systéme Mac OS X -f možnosť k dnešnému dňu je zdokumentovaná ako:

-f Použite input_fmt ako formátovací reťazec na analyzovanie poskytnutého new_date namiesto použitia predvoleného nastavenia [[[mm]dd]HH]MM[[cc]yy][.ss] formát. Analýza sa vykonáva pomocou strptime(3).

Preto by ste mali používať:

date -f "%d/%m/%Y" +"%Y-%m-%d" ...

Zvyškovým problémom však je prevod viacerých hodnôt; budete potrebovať viacnásobné vyvolanie date za to, takže by ste chceli vyskúšať niečo ako:

# 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

Toto sa však pokúsi nastaviť systémové hodiny (nie veľmi úspešne, pokiaľ root v tom čase, a nemali by ste byť root pri experimentovaní). Nie je teda zrejmý spôsob, ako získať date príkaz urobte, čo chcete.

Preto odpovede používajú awk, sed, perl, python a pravidelné výrazy na mapovanie dátumov.


1 pre odpoveď č. 4

Medzinárodný štandardný formát dátumu, ISO 8601, je YYYY-MM-DD, nie YYYY/MM/DD. Navrhujem to použiť, pokiaľ nemáte veľmi dobrý dôvod.

Americké a britské formáty dátumov sú pre dátumy pred 13. dňom každého mesiaca nejednoznačné, takže to neprekvapuje date nepoznal by som to. Môže existovať spôsob, ako mu povedať, že daný reťazec je vo formáte UK, ale neviem, čo to je.

Môžeš použiť sedalebo akýkoľvek iný nástroj, ktorý nahradzuje regulárne výrazy, na zmenu formátu:

$ 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 to dokáže o niečo menej podrobne:

$ echo 14/09/1992 | perl -pe "s/(dd)/(dd)/(dddd)/$3-$2-$1/"
1992-09-14

alebo:

$ echo 14/09/1992 | perl -pe "s/(d{2})/(d{2})/(d{4})/$3-$2-$1/"
1992-09-14

0 pre odpoveď č. 5

Ak používate Windows, môžete tiež zmeniť svoje miestne nastavenia a zmeniť formát dátumu v počítači ako celku a najmä v súbore .csv:

Win7:

1. / Prejdite na tlačidlo Štart 2. / Vyberte Ovládací panel 3. / Hodiny, jazyk a región. 4. / Zmeňte formát dátumu, času a čísla.