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ď č. 1Ak 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 pomocoustrptime(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ť sed
alebo 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.