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

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Pomoc se skriptem v sedu [VYRESENO]  (Přečteno 2112 krát)

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Pomoc se skriptem v sedu [VYRESENO]
« kdy: 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] 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):
Kód: [Vybrat]
#!/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:
Kód: [Vybrat]
        <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:

Kód: [Vybrat]
MAZÁNÍ VYBRANÝCH ŘÁDEK:

 # vypíše vše AŽ na oblast mezi "Iowa" a "Montana"
 sed '/Iowa/,/Montana/d'
ve formatu
Kód: [Vybrat]
sed -i 's/</,/>/dg' $soubor bohuzel ale bez uspechu... Dostanu vystup
Kód: [Vybrat]
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:
Kód: [Vybrat]
sed -i '/</,/>/d' $soubor
Bohuzel, ackoliv to funguje, vystup je neuspokojivy, smaze to mnohem vic, nez by melo.

Takze to obchazim postupnou aplikaci
Kód: [Vybrat]
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?
« Poslední změna: 16 Listopadu 2013, 17:31:58 od Václav Sobota »

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re:Pomoc se skriptem v sedu
« Odpověď #1 kdy: 16 Listopadu 2013, 17:31:32 »
Tak jsem na to nakonec prisel  ;)

Vysledny kód (pokud by se to nekomu hodilo) je:
Kód: [Vybrat]
#!/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:
Kód: [Vybrat]
       
       

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.
« Poslední změna: 17 Listopadu 2013, 04:59:17 od Václav Sobota »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Pomoc se skriptem v sedu [VYRESENO]
« Odpověď #2 kdy: 17 Listopadu 2013, 13:05:45 »
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 |

Kód: [Vybrat]
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í ;)
« Poslední změna: 17 Listopadu 2013, 19:26:27 od GdH »

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re:Pomoc se skriptem v sedu [VYRESENO]
« Odpověď #3 kdy: 17 Listopadu 2013, 16:49:49 »
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 |

Kód: [Vybrat]
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
« Poslední změna: 17 Listopadu 2013, 22:43:53 od Václav Sobota »

 

Provoz zaštiťuje spolek OpenAlt.