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: Václav Sobota 15 Listopadu 2013, 22:19:40
-
V souvislosti s tim, co jsem resil v tématu Import dat z internetu do vypoctu v LibreOffice Calc [VYRESENO] (http://forum.ubuntu.cz/index.php?topic=69628.0) jsem se pustil do sepsani takoveho maleho skriptu. Jeho cilem je, abych pri kazdem otevreni urcite tabulky v Calcu obdrzel aktualizovane menove kurzy - viz zminene tema.
Vytvoril jsem si skript, ktery zatim zni (nektere nepouzivane nebo zatim nepouzivane radky jsem pouze zakomentoval, ale nesmazal):#!/bin/bash
soubor="ExchangeRate"
datum=`date +'%m/%d/%y'`
# Vrati dnesni datum ve formatu MM/DD/YY
#mkdir "`date +'%Y-%m-%d'`"
# Vytvori slozku pojmenovanou dnesnim datem ve formatu YYYY-MM-DD
#echo "Folder `date +'%Y-%m-%d'` has been created"
cd /home/`whoami`/ ; mkdir "FOREX"; cd FOREX/
# Vytvori slozku FOREX pro aktualniho uzivatele v jeho domovskem adresari
touch "$soubor"
# Vytvori soubor pojmenovany podle promenne $soubor a cislem pred uvozovkami
echo "File $soubor has been created..."
wget -O "$soubor" "http://www.oanda.com/currency/table?date=$datum&date_fmt=normal&exch=EUR&sel_list=AMD_ARS_AUD_AZN_BGN_BRL_CAD_CHF_CLP_CNY_CZK_DKK_EUR_GBP_GEL_HKD_HRK_HUF_INR_IQD_ISK_JPY_KGS_KRW_KZT_LTL_LVL_MAD_MDL_MKD_MNT_MXN_MYR_NOK_NZD_PEN_PHP_PKR_PLN_PYG_RON_RSD_RUB_SEK_SGD_THB_TJS_TMT_TRY_UAH_USD_UYU_UZS_ZAR&value=1&format=CSV&redirected=1"
# Zapise obsah odkazu do souboru "$soubor" ve slozce FOREX
sleep 1
echo "Running data editor..."
sed -i '294,$d' "$soubor"
# Odstrani radky od 294 do konce ze souboru "$soubor"
sed -i '1,236d' "$soubor"
# Odstrani radky 1 az 236 ze souboru "$soubor"
sed -i '/./!d' "$soubor"
# Odstrani vsechny prazdne radky v souboru "$soubor"
#sed -i 's/,/;/g' "$soubor"
# Vymeni carky za stredniky
echo "Program will close in 2 seconds..."
sleep 2
exit 0
Po spusteni skriptu vsechno probehne normalne a ja obdrzim nasledujici vystup:
<FONT face=Verdana SIZE=2><B> Base Currency: Euro, EUR</B></FONT> on Friday, November 15, 2013 <BR><BR><TABLE BORDER=0 CELLPADDING=1 WIDTH=470> <TR BGCOLOR=#000000>
<TR><TD BGCOLOR=#efefef><PRE><font face=Verdana size=2>Currency,Code,EUR/1 Unit,Units/1 EUR
Armenian Dram,AMD,0.001831,546.458
Argentine Peso,ARS,<span>0.1243</span>,8<span>.</span>0552
Australian Dollar,AUD,0.6931,1.4431
Azerbaijan New Manat,AZN,0<!-- 0.33 -->.9476,1.0567
Bulgarian Lev,BGN,0.5114,1.9563
Brazilian Real,BRL,0.<!-- 0.99 -->3195,3<nobr>.</nobr>1382
Canadian Dollar,CAD,0.709,1<!-- 1.46 -->.4108
Swiss Franc,CHF,0.8113,1.2329
Chilean Peso,CLP,<span>0.00143</span>,<span>700<span>.</span>435</span>
Chinese Yuan Renminbi,CNY,0.1212,<span>8.2553</span>
Czech Koruna,CZK,<!-- 1.73 -->0.03691<!-- 7.31 -->,27.<!-- 0.33 -->1345
Danish Krone,DKK,0.1341,7.4591
Euro,EUR,1,1
British Pound,GBP,1.192,0.8391
Georgian Lari,GEL,0.4431,2.257
Hong Kong Dollar,HKD,0.09582,10.4392
Croatian Kuna,HRK,0.1312,<span>7.<!-- 0.03 -->6301</span>
Hungarian Forint,HUF,<span>0<span>.</span>003355</span>,298.585
Indian Rupee,INR,0.01177,<span>85<span>.</span>1665</span>
Iraqi Dinar,IQD,<span>0.0006396</span>,1572.75
Iceland Krona,ISK,<span>0.006089</span>,165.597
Japanese Yen,JPY,0<span></span>.007449,<!-- 0.38 -->134.271<!-- 3.80 -->
Kyrgyzstanian Som,KGS,0.01532,65.3477
South-Korean Won,KRW,0.000696,1439.91
Kazakhstan Tenge,KZT,0.004939,208<span>.</span>482
Lithuanian Litas,LTL,<!-- 0.13 -->0.2897<!-- 1.30 -->,3.<nobr></nobr>4536
Latvian Lats,LVL,1.4236,0.7033
Moroccan Dirham,MAD,0.08964,11.2336
Moldovan Leu,MDL,0.05869,17<span></span>.6411
Macedonian Denar,MKD,0<!-- 0.28 -->.01635,62.0755
Mongolian Tugrik,MNT,0.0004453,2252.39
Mexican Peso,MXN,0.05703,17.5492
Malaysian Ringgit,MYR,0.2322,4.3148
Norwegian Kroner,NOK,0.1203,8.<span></span>3188
New Zealand Dollar,NZD,0.615,1.6268
Peruvian Nuevo Sol,PEN,0.2704,3<nobr>.</nobr>812
Philippine Peso,PHP,0.01706,58.7526
Pakistan Rupee,PKR,0<!-- 1.13 -->.006937,<!-- 0.98 -->145.126<!-- 9.80 -->
Polish Zloty,PLN,0.2386,4.1961
Paraguay Guarani,PYG,0.0001721,6071.39
Romanian New Lei,RON,0.2246,4.4612
Serbian Dinar,RSD,0.008817,114.588
Russian Rouble,RUB,0<!-- 1.67 -->.02272,<span>44.069</span>
Swedish Krona,SEK,0.1116,8.9655
Singapore Dollar,SGD,<span>0.5958</span>,1<nobr>.</nobr>6792
Thai Baht,THB,0.02359,42.5387
Tajikistani Somoni,TJS,0.1557,6.4233
Turkmenistan New Manat,TMT,0.2606,3.837
Turkish Lira,TRY,0.364,2.7499
Ukraine Hryvnia,UAH,0.0921,11.1389
US Dollar,USD,0.<span></span>7428,<span>1.3463</span>
Uruguayan Peso,UYU,0.03547,29.3972
Uzbekistan Som,UZS,0.<!-- 0.35 -->0003428,2930.<!-- 1.63 -->94
South African Rand,ZAR,0.07228,<!-- 1.64 -->13.8504<!-- 6.41 -->
A tim se dostavame k jadru pudla - potrebuji dat sedu prikaz, aby smazal vsechno mezi znaky < a > na kazde radce, a to i v pripade vice vyskytu. Zkousel jsem variace na tetnto priklad (http://sed.sourceforge.net/sed1line_cz.html):
MAZÁNÍ VYBRANÝCH ŘÁDEK:
# vypíše vše AŽ na oblast mezi "Iowa" a "Montana"
sed '/Iowa/,/Montana/d'
ve formatu sed -i 's/</,/>/dg' $soubor
bohuzel ale bez uspechu... Dostanu vystup vs@VirtualBox ~ $ sed -i 's/</,/>/dg' /home/vs/FOREX/ExchangeRate
sed: -e expression #1, char 7: unknown option to `s'
Nemel by pro me nekdo radu? Predem diky!
EDIT: Tak problem s tim prikazem jsem vyresil - to s bylo navic, kod mel byt: sed -i '/</,/>/d' $soubor
Bohuzel, ackoliv to funguje, vystup je neuspokojivy, smaze to mnohem vic, nez by melo.
Takze to obchazim postupnou aplikaci sed -i 's/<span>//g'
sed -i 's/<\/span>//g'
sed -i 's/<nobr>//g'
sed -i 's/<\/nobr>//g'
Nicmene, potreboval bych jeste zjistit, jaky zastupny znak pouzit pro libovolne cislo?
-
Tak jsem na to nakonec prisel ;)
Vysledny kód (pokud by se to nekomu hodilo) je:
#!/bin/bash
soubor="ExchangeRate"
datum=`date +'%m/%d/%y'`
# Vrati dnesni datum ve formatu MM/DD/YY
#mkdir "`date +'%Y-%m-%d'`"
# Vytvori slozku pojmenovanou dnesnim datem ve formatu YYYY-MM-DD
#echo "Folder `date +'%Y-%m-%d'` has been created"
cd /home/`whoami`/ ; mkdir "FOREX"; cd FOREX/
# Vytvori slozku FOREX pro aktualniho uzivatele v jeho domovskem adresari
touch "$soubor"
# Vytvori soubor pojmenovany podle promenne $soubor a cislem pred uvozovkami
echo "File $soubor has been created..."
wget -O "$soubor" "http://www.oanda.com/currency/table?date=$datum&date_fmt=normal&exch=EUR&sel_list=AMD_ARS_AUD_AZN_BGN_BRL_CAD_CHF_CLP_CNY_CZK_DKK_EUR_GBP_GEL_HKD_HRK_HUF_INR_IQD_ISK_JPY_KGS_KRW_KZT_LTL_LVL_MAD_MDL_MKD_MNT_MXN_MYR_NOK_NZD_PEN_PHP_PKR_PLN_PYG_RON_RSD_RUB_SEK_SGD_THB_TJS_TMT_TRY_UAH_USD_UYU_UZS_ZAR&value=1&format=CSV&redirected=1"
# Zapise obsah odkazu do souboru "$soubor" ve slozce FOREX
sleep 1
echo "Running data editor..."
sed -i '294,$d' "$soubor"
# Odstrani radky od 294 do konce ze souboru "$soubor"
sed -i '1,236d' "$soubor"
# Odstrani radky 1 az 236 ze souboru "$soubor"
sed -i '/./!d' "$soubor"
# Odstrani vsechny prazdne radky v souboru "$soubor"
sed -i 's/<span>//g' $soubor
sed -i 's/<\/span>//g' $soubor
sed -i 's/<nobr>//g' $soubor
sed -i 's/<\/nobr>//g' $soubor
sed -i 's/<!-- .... -->//g' $soubor
sed -i 's/..;//g' $soubor
sed -i 's/<.*>//g' $soubor
sed -i '/./!d' "$soubor"
# Odstrani vsechny prazdne radky v souboru "$soubor"
sed -i 's/,/;/g' "$soubor"
# Vymeni carky za stredniky
sed -i 's/\./,/g' "$soubor"
# Vymeni tecky za carky
echo "Program will close in 2 seconds..."
sleep 2
exit 0
Jeste pridam kontrolu existence slozky "FOREX" a par dalsich veci, ale to eventuelne budu resit v jinem tematu.
Vystup programu je nasledujici:
Currency;Code;EUR/1 Unit;Units/1 EUR
Armenian Dram;AMD;0,00131;546,474
Argentine Peso;ARS;0,1241;8,0699
Australian Dollar;AUD;0,6938;1,4416
Azerbaijan New Manat;AZN;0,9476;1,0568
Bulgarian Lev;BGN;0,5115;1,9562
Brazilian Real;BRL;0,3213;3,1216
Canadian Dollar;CAD;0,7099;1,4091
Swiss Franc;CHF;0,8103;1,2343
Chilean Peso;CLP;0,001428;701,132
Chinese Yuan Renminbi;CNY;0,1212;8,2578
Czech Koruna;CZK;0,03688;27,158
Danish Krone;DKK;0,1341;7,459
Euro;EUR;1;1
British Pound;GBP;1,1945;0,8373
Georgian Lari;GEL;0,4431;2,27
Hong Kong Dollar;HKD;0,0958;10,4412
Croatian Kuna;HRK;0,1311;7,632
Hungarian Forint;HUF;0,003357;298,346
Indian Rupee;INR;0,0118;84,9425
Iraqi Dinar;IQD;0,0006406;1575,36
Iceland Krona;ISK;0,006089;165,602
Japanese Yen;JPY;0,007412;134,933
Kyrgyzstanian Som;KGS;0,01532;65,3496
South-Korean Won;KRW;0,0006985;1434,89
Kazakhstan Tenge;KZT;0,00492;209,257
Lithuanian Litas;LTL;0,2898;3,4523
Latvian Lats;LVL;1,4243;0,7031
Moroccan Dirham;MAD;0,08958;11,2325
Moldovan Leu;MDL;0,05851;17,6942
Macedonian Denar;MKD;0,01636;62,0324
Mongolian Tugrik;MNT;0,0004453;2252,46
Mexican Peso;MXN;0,05733;17,4549
Malaysian Ringgit;MYR;0,2322;4,3146
Norwegian Kroner;NOK;0,121;8,2711
New Zealand Dollar;NZD;0,6165;1,6227
Peruvian Nuevo Sol;PEN;0,2697;3,8229
Philippine Peso;PHP;0,01706;58,7433
Pakistan Rupee;PKR;0,006948;145,176
Polish Zloty;PLN;0,239;4,1915
Paraguay Guarani;PYG;0,0001716;6089,04
Romanian New Lei;RON;0,2249;4,455
Serbian Dinar;RSD;0,008813;114,645
Russian Rouble;RUB;0,02276;44,0055
Swedish Krona;SEK;0,1118;8,9516
Singapore Dollar;SGD;0,5957;1,677
Thai Baht;THB;0,02355;42,6046
Tajikistani Somoni;TJS;0,1557;6,4235
Turkmenistan New Manat;TMT;0,2606;3,8371
Turkish Lira;TRY;0,3652;2,7402
Ukraine Hryvnia;UAH;0,09187;11,1665
US Dollar;USD;0,7428;1,3464
Uruguayan Peso;UYU;0,03558;29,3101
Uzbekistan Som;UZS;0,0003428;2931,03
South African Rand;ZAR;0,07291;13,7308
EDIT: Format dat dostupnych na zdrojove strance se meni, zrejme nahodne. Nasledkem je, ze v prumeru jedna mena v azde druhe aktualizaci zobrazi zcela spatne hodnoty (vynecha desetinnou tecku). Nejspis je too protiopatreni prave proti automatizovanemu pouzivani (nabizi data feed jako sluzbu za $200 rocne) tech dat. Po kratsim hledani (Duck Duck Go to v tomhle pripade Googlu pekne natrel) se mi podarilo najit lepsi zdroj dat a skript jsem kompletne predelal a vylepsil. Uverejnim ho v jinem prispevku - pridam sem na nej odkaz.
-
Jen co jsem zachytil na první pohled.. x krát za sebou číst soubor, upravit ho a opět zapisovat na disk není zrovna efektivní řešení. Takže např. je dobré poznat logický operátor OR, který se píše takto |
sed -i 's@</?span>\|</?nobr>\|<!-- .... -->\|..;\|<.*>@@g'
Prostoru pro optimalizaci tam máš ještě dostatek ;)
EDIT: jen jsem tam zapoměl použít otazníčky a jiný delimiter, aby lomítka nebylo potřeba escapovat, pro další zjednodušení ;)
-
Jen co jsem zachytil na první pohled.. x krát za sebou číst soubor, upravit ho a opět zapisovat na disk není zrovna efektivní řešení. Takže např. je dobré poznat logický operátor OR, který se píše takto |
sed -i 's/<span>\|<\/span>\|<nobr>\|<\/nobr>\|<!-- .... -->\|..;\|<.*>//g'
Prostoru pro optimalizaci tam máš ještě dostatek ;)
To mas samozrejme naprostou pravdu :) Ja jsem v tom naprosty elev, jako stavar programovani v podstate k nicemu nepotrebuju. Ale laka me to a docela bavi ::) .
Treba ten operator OR jsem tak nejak znal, ale asi bych nikdy neprisel na to, jak ho aplikovat v sedu. Takze kazdopadne dekuji! Ja uz jsem ten skript kompletne prekopal - presel jsem na Yahoo Finance, kteri data normalne poskytuji (puvodne jsem ale nevedel, ze maji primo takovy "data feed" a skutecne vsechny meny). Ale nevyhoda je, ze jednotlive, ne davkove. Takze pro 20 men je to stazeni 20ti souboru wgetem, coz je docela pomale. To by ani tolik nevadilo (me ta pomalost vadila v LibreOffice, protoze byl zaseklej behem stahovani, ale nebylo znat, ze neco dela), ale je mi jasne, ze by se to dalo resit elegantneji - brzo o tom napisu vice do zvlastniho tematu, na ktere zde odkazi.
EDIT: Odkaz na tema Optimalizace skriptu (http://forum.ubuntu.cz/index.php?topic=69689.0)