BASH - upravy textoveho souboru

Libor Chocholaty libor_ml1 na mts.cz
Pátek Prosinec 9 15:49:50 CET 2005


Michal Jezek wrote:

>Michal Jezek wrote:
>  
>
>>Dobry den.
>>    Mam teplotni cidlo, ktere mam pripojene k seriovem portu. BASH skriptem si z nej zjistim teplotu a chci si ji ukladat do textoveho souboru, ktery nasledne 1x denne z jineho serveru automaticky budu natahovat do Firebird databaze. Odtud uz data zobrazuji pres php na webu.
>>    Potrebuji ve zminenem textovem souboru, ktery ma zhruba takovouhle strukturu:
>>......
>>15;20.11.2005;16:15:22;2,5
>>16;20.11.2005;16:16:23;2,6
>>17;20.11.2005;16:17:25;2,4
>>18;20.11.2005;16:18:28;2,3
>>19;20.11.2005;16:19:30;2,0
>>........
>>provadet upravy. A to najit posledni radek, z nej zjistit prvni cislo pred strednikem (poradove cislo mereni abych to mohl jednoduse tahat do databaze), a pripadne vytahnout dalsi udaje - datum, cas a teplotu (oddelovac je strednik, ale nemusi to byt nutne tento znak) a tyto udaje natahnout do promenych pro dalsi praci va skriptu (pridani dalsiho zaznamu nebo pretahovani do SQL databaze)
>>     Soubor si otevru, nejaky radek z nej nactu, ale nevim jakym zpusobem ten radek rozpitvat na jednotlive polozky. Nezjistil jsem jaky prikaz na toto pouzit. Nebo na to jdu od zacatku spatne a musim na to pouzit jiny skriptovaci jazyk?
>>
>>     Diky za pripadne nakopnuti spravnym smerem
>>                       Michal Jezek---------------------------------------
>>    
>>
>
>Diky za reakce a rady.
>Asi jsem se ale vyjadril trochu zavadejicim zpusobem. SORRY! Ten textak neportebuju upravovat tim ze z nej vypreparuju stredniky nebo nejake jine specialni upravy.
>V pripade zapisu dalsi teploty potrebuju najit posledni radek - treba:
>posledni_radek=$(tail -1 ./pokus.txt)
>z nej vyzjistit poradi posledni merene hodnoty a strcit ji do nejake promene:
>??????????? --- a tady tohle prave neumim.
>k poradi merene hodnoty pricist jednicku:
>dalsi_radek=$posledni_radek + 1  
>A pak slozit dalsi radek a pripojit ho na konec souboru:
>echo $dalsi_radek";"$(date +%d.%m.%Y)";"$(date +%T)";"$TEPLOTA  >> ./pokus.txt
>
>No a kdyz budu prenaset data do SQL tak potrebuju najit radek s posledni teplotou ulozenou v databazi
>
>while IFS=";" read poradi datum cas teplota
>do
>.....
>tady to budu nejak porovnavat a zpracovavat
>.....
>done < ./pokus.txt
>
>a postupne ukladat aktualni radek a nasledujici radky do SQL
>echo "INSERT INTO \"teploty\" (\"poradi\",\"datum\",\"cas\",\"teplota\") \
>VALUES($poradi,'$(date +%d.%m.%Y)','$(date +%T)',$TEPLOTA);" | /opt/firebird/bin/isql \
>/home/database/teplota.fdb -u xxx -p xxx;
>
>No a ted moje pokusy: Kdyz napisu 
>IFS=";" read poradi datum cas teplota <./pokus.txt
>tak se mi to spravne rozhodi do promenych. Jede to ale od zacatku souboru, coz v mem pripade je neefektivni.
>Kdyz ale napisu
>echo $(tail -1 ./pokus.txt) | IFS=";" read poradi datum cas teplota 
>tak mi do promenych nic nenaplni prestoze echo $(tail -1 ./pokus.txt) vypise spravne radek.
>Kdyz zadam prikaz
>IFS=";" read cislo_mer datum cas teplota
>tak to ceka na prikazovem radku a pokud mu napisu nejaka data oddelene strednikem a pak dam enter tak to spravne rozhodi do promenych a ty mi pak treba nasledne vypise.
>
>  
>
Neni to tim, ze nepotrebujete nic cist, jen rozebrat ten radek?
Ja v podobnych pripadech pouzivam cut(1):
$ poradi=`tail -1 teploty.txt | cut -d ';' -f 1`
$ echo $poradi

Libor





Další informace o konferenci Linux