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.


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

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}'

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

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

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)' -- {} \;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.