Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: martin.nohejl 01 Května 2015, 18:32:36

Název: Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 01 Května 2015, 18:32:36
Potřeboval bych provádět operace s proměnnou obsahující datum:
např.:

DATUM1=14.3.2015
DEN=5
DATUM2=$(($DATUM1+$DEN))
echo $DATUM2


Potřebuju ,aby v proměnné DATUM2 bylo 19.3.2015, ale již při zadávání DATUM2=$(($DATUM1+$DEN)) mi to zahlásí:

bash: 14.3.2015+5: syntaktická chyba: chybný aritmetický operátor (chybný token je „.3.2015+5“)
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: Jakub Vaněk 01 Května 2015, 18:39:37
Tohle už vypadá jako domácí úkol...
http://superuser.com/questions/45592/how-to-add-a-day-to-date-in-bash
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 01 Května 2015, 18:46:48
No úplně jsem to z toho nepochopil. Když zadám:

$ date -d "1983-08-04 348 days"

tak mi to vypíše:

$: příkaz nebyl nalezen

Když zadám:

$date -d "1983-08-04 348 days"

tak mi to vypíše:

-d: příkaz nebyl nalezen
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: Jakub Vaněk 01 Května 2015, 18:48:37
No úplně jsem to z toho nepochopil. Když zadám:

$ date -d "1983-08-04 348 days"

tak mi to vypíše:

$: příkaz nebyl nalezen

Když zadám:

$date -d "1983-08-04 348 days"

tak mi to vypíše:

-d: příkaz nebyl nalezen
LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
Kód: [Vybrat]
date -d "1983-08-04 348 days"
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: GdH 01 Května 2015, 18:55:31
Plus je tam ještě možnost formátování výstupu, takže tvůj příklad by mohl vypadat třeba takto:
Kód: [Vybrat]
date -d "20150314 + 5 days" "+%d.%m.%Y"
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 01 Května 2015, 19:26:57

LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
Jo jsem to ale blbec, to jsem si neuvědomil.

A pokud bych chtěl do vstupu dát formát den měsíc rok?
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: Jakub Vaněk 01 Května 2015, 19:37:48

LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
Jo jsem to ale blbec, to jsem si neuvědomil.

A pokud bych chtěl do vstupu dát formát den měsíc rok?

Plus je tam ještě možnost formátování výstupu, takže tvůj příklad by mohl vypadat třeba takto:
Kód: [Vybrat]
date -d "20150314 + 5 days" "+%d.%m.%Y"
Plus ještě:
https://www.phil.muni.cz/~letty/linuxfaq/66-date.html
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ - dole je přehledná tabulka zkratek
http://unixhelp.ed.ac.uk/CGI/man-cgi?date
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 01 Května 2015, 23:07:11
No tak když to shrnu:
-skript můžu napsat takto:

#!/bin/sh
DATUM1=2015-03-14
DEN=5
DATUM2=$(date -d "$DATUM1 $DEN days" "+%d.%m.%Y")
echo $DATUM2


Pak ale nevím, jak to udělat, když proměnnou DATUM1 budu načítat s texťáku, ve kterém budu mít datum uveden d.m.r (tzn.14.3.2015).
Odkazy viz níže spíš upravují výstup a já potřebuji upravit vstup. Nebo aspoň nevím,  jak těch odkazů využít.
https://www.phil.muni.cz/~letty/linuxfaq/66-date.html
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ - dole je přehledná tabulka zkratek
http://unixhelp.ed.ac.uk/CGI/man-cgi?date
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: Jakub Vaněk 01 Května 2015, 23:38:36
Googluj sed replace, stačí vyměnit . za -
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 02 Května 2015, 07:41:27
Vyměnit . za - umím, ale ještě pořadí.
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: martin.nohejl 02 Května 2015, 09:12:09
No tak jsem to nakonec vymyslel takto:

#!/bin/sh
DMRDAT1=14.3.2015
RMDDAT1=$(echo $DMRDAT1 | tr "." " " | awk '{ print $3"-"$2"-"$1 }')
DEN=5
DMRDATUM2=$(date -d "$RMDDAT1 $DEN days" "+%d.%m.%Y")
echo $DMRDATUM2


Nevím sice, jestli to je ideální řešení, ale funguje to.
Název: Re:Operace s proměnnou obsahující datum
Přispěvatel: GdH 02 Května 2015, 09:28:59
Lze to trochu zjednodušit, awk umí všechno, co potřebuješ.

Kód: [Vybrat]
awk 'BEGIN {FS="[^0-9]"}; {print $3"-"$2"-"$1}'
Proměnná FS obsahuje řetězec, který jednotlivá pole odděluje. Lze použít i regulární výrazy, v tomto případě jsem definoval, že oddělovačem bude jakýkoliv znak, který není číslem.

Pro zajímavost ještě ten sed:
Kód: [Vybrat]
sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3-\2-\1/'
s GNU sed, který je v ubuntu, lze vynechat nějaké ty escape znaky:
Kód: [Vybrat]
sed -r 's/([0-9]*).([0-9]*).([0-9]*)/\3-\2-\1/'