Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.

Autor Téma: Operace s proměnnou obsahující datum  (Přečteno 4581 krát)

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Operace s proměnnou obsahující datum
« kdy: 01 Květen 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“)
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

Jakub Vaněk

  • Stálý člen
  • ***
  • Příspěvků: 752
    • Zobrazit profil
    • Web programátora a studenta Jakuba Vaňka
Re:Operace s proměnnou obsahující datum
« Odpověď #1 kdy: 01 Květen 2015, 18:39:37 »
Notebook: Lenovo Thinkpad X200, Xubuntu 16.04

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Operace s proměnnou obsahující datum
« Odpověď #2 kdy: 01 Květen 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
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

Jakub Vaněk

  • Stálý člen
  • ***
  • Příspěvků: 752
    • Zobrazit profil
    • Web programátora a studenta Jakuba Vaňka
Re:Operace s proměnnou obsahující datum
« Odpověď #3 kdy: 01 Květen 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"
Notebook: Lenovo Thinkpad X200, Xubuntu 16.04

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Operace s proměnnou obsahující datum
« Odpověď #4 kdy: 01 Květen 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"

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Operace s proměnnou obsahující datum
« Odpověď #5 kdy: 01 Květen 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?
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

Jakub Vaněk

  • Stálý člen
  • ***
  • Příspěvků: 752
    • Zobrazit profil
    • Web programátora a studenta Jakuba Vaňka
Re:Operace s proměnnou obsahující datum
« Odpověď #6 kdy: 01 Květen 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
« Poslední změna: 01 Květen 2015, 19:39:46 od Jakub Vaněk »
Notebook: Lenovo Thinkpad X200, Xubuntu 16.04

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Operace s proměnnou obsahující datum
« Odpověď #7 kdy: 01 Květen 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
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

Jakub Vaněk

  • Stálý člen
  • ***
  • Příspěvků: 752
    • Zobrazit profil
    • Web programátora a studenta Jakuba Vaňka
Re:Operace s proměnnou obsahující datum
« Odpověď #8 kdy: 01 Květen 2015, 23:38:36 »
Googluj sed replace, stačí vyměnit . za -
Notebook: Lenovo Thinkpad X200, Xubuntu 16.04

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Operace s proměnnou obsahující datum
« Odpověď #9 kdy: 02 Květen 2015, 07:41:27 »
Vyměnit . za - umím, ale ještě pořadí.
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Operace s proměnnou obsahující datum
« Odpověď #10 kdy: 02 Květen 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.
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Operace s proměnnou obsahující datum
« Odpověď #11 kdy: 02 Květen 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/'