Jak przekonwertować z jednego formatu daty na inny format?

11

Mam jeden problem z formatem daty. Chcę zmienić z jednego formatu na drugi i odwrotnie. Moje formaty dat to

Format 1

YYYY-MM-DD

Format 2

MM/DD/YYYY

Chcę zmienić format 1 na format 2 i format 2 na format 1.

AiB
źródło
o jaśniej, mam plik nazwa pliku1: data 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Wymagane dane wyjściowe to 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 i odwrotnie
AiB
Naprzód-ukośniki są jednym z zaledwie dwóch znaków, które nie mogą być w pliku * nix ...
evilsoup

Odpowiedzi:

14

Użyj do tego „daty” GNU. Konwertuje również inne formaty dla ciebie (zobacz date --helplistę formatów).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
Stéphane Chazelas
źródło
dla jasności mam plik nazwa pliku1: data 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Wymagane dane wyjściowe to 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 i odwrotnie
AiB
1
@Abraham, jak to nie spełnia tego wymogu?
jordanm
6

Zakładając, że masz daty w formie tekstowej, które należy przekonwertować

echo '2013-12-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}'

I wzajemnie

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
iruvar
źródło
dla jasności mam plik nazwa pliku1: data 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Wymagane dane wyjściowe to 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 i odwrotnie
AiB
Dziękuję 1_CR, Działa teraz po tym, jak trochę zmodyfikowałem !! #! / bin / bash echo „$ 1- $ 2- $ 3 $” | awk -v FS = - -v OFS = / '{print $ 2, 3 $, 1 $} data.file
AiB
@Abraham, powinieneś spróbować szczęścia z datepodejściem drewbenna , które z pewnością jest bardziej eleganckie
iruvar
3
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Jeśli masz plik z wieloma datami, po jednym w wierszu:

awk -F- -vOFS=/ '{print $2,$3,$1}' < that-file
Stéphane Chazelas
źródło
0

Używając sed w następujący sposób:

$ echo '2013-12-13' | sed -r 's/([[:digit:]]{2,4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})/\2\/\3\/\1/g'
12/13/2013
$ echo '12/13/2013' | sed -r 's/([[:digit:]]{1,2})\/([[:digit:]]{1,2})\/([[:digit:]]{2,4})/\3-\1-\2/g'
2013-12-13
mark_infinite
źródło
0

Odpowiadając na wyjaśnione pytanie w komentarzach na temat zmiany formatu daty w nazwie pliku, skorzystaj z wariantu gnu datepodejścia Drawbenna . To polecenie znajduje wszystkie pliki w folderze lokalnym i przesyła do nazwy tylko nazwę pliku xargs, zastępując datezmodyfikowaną nazwę pliku drugim argumentem, na mvktóry wykonuje się zmiana nazwy.

Dodatkowe, nieco okrężne stosowanie bashzmiennego podstawiania jest konieczne podczas bashoceny datepolecenia.

find ./ -printf '%f\n' | xargs -I '{}' sh -c 'mv $1  $(date -j -f %Y-%m-%d $1 +%m/%d%Y)' -- {} \;
Obrabować
źródło