Sida 1 av 1

Bash if-sats? Resurskrävande?

Postat: 01 mar 2008, 18:12
av webaake
Har gjortt ett script som skall söka ut engelska termer och ersätta dem med svenska:

if [ "$WINDD" = "S (" ]; then
vindriktning="Sydlig vind";
elif [ "$WINDD" = "W (" ]; then
vindriktning="Västlig vind";
elif [ "$WINDD" = "SSW" ]; then
vindriktning="SydSydVäst";
elif [ "$WINDD" = "WSW" ]; then
vindriktning="VästSydVäst";
elif [ "$WINDD" = "WNW" ]; then
vindriktning="VästNordVäst";
elif [ "$WINDD" = "NWN" ]; then
vindriktning="NordNordVäst";
elif [ "$WINDD" = "N (" ]; then
vindriktning="Nordlig";
elif [ "$WINDD" = "NW " ]; then
vindriktning="NordVästlig";
elif [ "$WINDD" = "NNE" ]; then
vindriktning="NordNordÖst";
elif [ "$WINDD" = "NE " ]; then
vindriktning="NordÖstlig";
elif [ "$WINDD" = "ENE" ]; then
vindriktning="ÖstNordÖst";
elif [ "$WINDD" = "E (" ]; then
vindriktning="Östlig";
elif [ "$WINDD" = "ESE" ]; then
vindriktning="ÖstSydÖst";
elif [ "$WINDD" = "SE " ]; then
vindriktning="SydÖstlig";
elif [ "$WINDD" = "SSE" ]; then
vindriktning="SydSydÖst";
else
vindriktning="SydVäst";
fi


Koden funkar fint men verkar vara resusrsrävande. Finns det nåt bättre sätt typ 'case' eller nåt, för att göra samma sak snabbare?


En fråga till; det lär gå att söka ut delar av en sträng och byta ut dem typ;
STRING='min sträng'
MATCH='sträng'
REPLACE='ersättning eller vad som helst'
NEWSTRING=${STRING/MATCH/REPLACE}
men jag har inte fått dett funka. Jag har prövat "STRING", 'STRING' m m.
Har dock fått ${STRING:3:5} att söka ut de tecknen 3-5 i min sträng, men är inte samma sak.

Tacksam för hjälp!

SV: Bash if-sats? Resurskrävande?

Postat: 01 mar 2008, 18:24
av Konservburk
webaake skrev: Koden funkar fint men verkar vara resusrsrävande. Finns det nåt bättre sätt typ 'case' eller nåt, för att göra samma sak snabbare?
case finns:

Kod: Markera allt

case $WINDD in '')
;; 'SSW') vindriktning='SydSydVäst'
;; 'ENE') vindriktning='ÖstNordÖst'
;; 'NWN') vindriktning='NordNordVäst'
esac
webaake skrev: En fråga till; det lär gå att söka ut delar av en sträng och byta ut dem typ;
STRING='min sträng'
MATCH='sträng'
REPLACE='ersättning eller vad som helst'
NEWSTRING=${STRING/MATCH/REPLACE}
Du försöker byta ut strängen "MATCH" mot strängen "REPLACE"....

Kod: Markera allt

NEWSTRING=${STRING/$MATCH/$REPLACE}
eller

Kod: Markera allt

NEWSTRING=${STRING/sträng/ersättning eller vad som helst}

SV: Bash if-sats? Resurskrävande?

Postat: 01 mar 2008, 20:13
av webaake
Tackar tackar! case ser fint ut. Nu har jag lärt mig nåt nytt! Tydlig och fin kod!

Mitt andra problem är egentligen att emellan en mängd HTML söka ut värden (temp m m) och använda dem. Kanske denna awk-kod kan vara lösningen:

*print all fields of lines between these start/stop pairs:
awk '/Cf/, /Of/' noisey.vfl
awk '/pragma/, /surface/' noisey.vfl

*prints same as above but just first field
awk '/pragma/, /surface/ {print $1}' noisey.vfl

typ;
TEMP=${cat resultat.txt | awk '/<span class="temp">Temperature:/,/</span>/' {return $1} }
( skulle ge TEMP = rådande temperatur i siffror)
Man måste nog 'backqouta' ( \ ) ut vissa tecken, men det kanske skulle funka?

Har testat Perl och HTML::parser, men det är över min nivå, ännu.

SV: Bash if-sats? Resurskrävande?

Postat: 01 mar 2008, 22:13
av Konservburk
Med den där awk-grejen får du alla rader från html-filen mellan de båda olika
matchningarna.  Men det är inte riktigt vad du vill ha.  Det går säkert att fixa
med awk, men jag tycker sed verkar enklare i det här fallet.

Kod: Markera allt

TEMP=$(sed -n 's,.*<span class="Temp">Temperature:\([^<]*\)</span>.*,\1,p' <fil.html)
Exakt hur det ska vara beror helt på hur html-filen ser ut.

Men för att få ut väderdata tycker jag det är betydligt enklare att använda
en ordentlig xml-feed och plock ut informationen med en riktig xml-parser.

T.ex. för att ta reda på temperaturen i Stockholm:

Kod: Markera allt

TEMP_STOCKHOLM=$( \
   curl -s 'http://xoap.weather.com/weather/local/SWXX0031?cc&unit=m' \
   | xmlstarlet sel -t -v /weather/cc/tmp \
)

SV: Bash if-sats? Resurskrävande?

Postat: 01 mar 2008, 22:56
av webaake
Tack igen!

Jo, jag har testat xoap, men de hade ingen tillräckligt korrekt väderstation för mina behov. Den låg för långt bort. Jag hämtar nu data från rssweather.com istället. De har en station mycket närmare, med bättre data. Dock har de ingen bra xml-feed, verkar det som.

Man får också väga in att det är kul att lära sig nya saker som bash, sed, awk, grep och pcregrep m m. (nya för mig alltså).

Den där sed-koden skall jag testa när slutar jobba inatt kl 04.00.

Tack o hej! Jag skall rapportera hur det går. Kanske nån vill se den färdiga koden i mitt väderscript för conky?

Re: Bash if-sats? Resurskrävande?

Postat: 02 mar 2008, 13:46
av webaake
sed-koden är suverän !!! Funkar fin-fint!

Min kod blev:

#Sök ut allt mellan HTML-taggarna för tempen:
TEMP3=$(sed -n 's,.*<p class="temp">Temperature:\([^<]*\)</p>.*,\1,p' <resultat.txt)

#Kolla om första tecknet är ett minustecken:
TEMP5=$( echo $TEMP3 | cut -c 1)
#Isåfall sätt minus som minus och lägg till det senare
#pcregrep i TEMP4 tar ju bara siffrorna...
if [ $TEMP5 == - ]; then
minus="-";
else
minus=""
fi
#Denna temp visas (d = digits):
TEMP4=$(echo $TEMP3 | pcregrep -o '\d+')
--> Ovanstående var tvunget då resultatet av sed-satsen var typ; 7°C och denna sats tar bara med de inledande siffrorna

Nu tror jag att jag täckt i alla varianter av värdet på tempen; minus och tvåsiffriga temperaturer, ja även tresiffriga , men då är det inte så viktigt längre.

Tackar o. bockar för all hjälp! Nu skall jag trolla vidare med sed-satsen du gav mig och ta reda på hur den egentligen funkar.