harteknut
Anmeldungsdatum: 9. Oktober 2007
Beiträge: Zähle...
|
Hallo Zusammen! Ich habe hier eine Textdatei mit Wetterdaten, aus der ich die Temperaturen rausbekommen möchte. Die Datei sieht so aus (*.json): | { location: 'Ort', updated: '13.04.2014 20:46', cityId: 123456,
current: { icon: '33', text: 'Clear', temp: 15, humidity: '41', dewpoint: 2, pressure: 1017, pressureState: 0, windSpeed: 11, windDir: 'W', visibility: 48 },
days: [ {date: '13.04.2014', tempLow: 4, tempHigh: 17, icon: '03', windSpeed: 11, windDir: 'W', windDirDegree: 270 },
{date: '14.04.2014', tempLow: 1, tempHigh: 13, icon: '18', windSpeed: 11, windDir: 'WNW', windDirDegree: 292.5 },
{date: '15.04.2014', tempLow: -1, tempHigh: 11, icon: '06', windSpeed: 6, windDir: 'NNW', windDirDegree: 337.5 },
{date: '16.04.2014', tempLow: 0, tempHigh: 12, icon: '01', windSpeed: 8, windDir: 'E', windDirDegree: 90 } ]
}
|
Zunächst bräuchte ich mal tempHigh. Mein Skript sieht daher bislang so aus:
| #! /bin/sh
d='wetterdatei.json'
temp_high=$(sed -n -e '/.*tempHigh: /p' $d | sed -e 's/.*tempHigh: //g' | sed -e 's/,.*//g')
|
In temp_high stehen jetzt alle Höchsttemperaturen hintereinander:
| echo $temp_high
17 13 11 12
|
Das ist aber nur eine Zeichenkette.
Könnt Ihr mir sagen, wie ich die Einzeltemperaturen in entsprechende Variabeln bekomme?
Vielleicht sogar in ein Array? Das wär cool... ☺ Danke euch schon jetzt sehr,
Simon
|
TomTobin
Anmeldungsdatum: 24. August 2007
Beiträge: 3094
|
Hallo harteknut, echo 17 13 11 12 | cut -d ' ' -f 1
echo 17 13 11 12 | cut -d ' ' -f 2
echo 17 13 11 12 | cut -d ' ' -f 3
echo 17 13 11 12 | cut -d ' ' -f 4 oder temperatur=$(echo 17 13 11 12 | cut -d ' ' -f 4)
echo $temperatur zum Anregen 😉 Gruß Tom
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
harteknut schrieb:
Ich habe hier eine Textdatei mit Wetterdaten, aus der ich die Temperaturen rausbekommen möchte. Die Datei sieht so aus (*.json):
Das ist aber kein gültiges JSON! Normalerweise würde ich ein passendes Werkzeug für JSON nutzen, aber in diesem Fall müssen wir zu anderen greifen. Wenn Du das Format korrigieren kannst, würde ich das immer noch bevorzugen.
Zunächst bräuchte ich mal tempHigh. Mein Skript sieht daher bislang so aus:
| #! /bin/sh
d='wetterdatei.json'
temp_high=$(sed -n -e '/.*tempHigh: /p' $d | sed -e 's/.*tempHigh: //g' | sed -e 's/,.*//g')
|
Das funktioniert nicht, wenn mehrere "tempHigh" in einer Zeile stehen. Da würde ich lieber egrep -o verwenden.
Könnt Ihr mir sagen, wie ich die Einzeltemperaturen in entsprechende Variabeln bekomme?
Vielleicht sogar in ein Array? Das wär cool... ☺
1. Schritt: alle "tempHigh" extrahieren: $ egrep -o 'tempHigh:[[:space:]]*[[:digit:]]+' x.json
tempHigh: 17
tempHigh: 13
tempHigh: 11
tempHigh: 12 2. Schritt: nur die Zahlen überleben $ egrep -o 'tempHigh:[[:space:]]*[[:digit:]]+' x.json | cut -d ' ' -f 2
17
13
11
12 oder $ egrep -o 'tempHigh:[[:space:]]*[[:digit:]]+' x.json | egrep -o '[[:digit:]]+'
17
13
11
12 3. Schritt: im Array speichern $ highs=($(egrep -o 'tempHigh:[[:space:]]*[[:digit:]]+' x.json | cut -d ' ' -f 2))
$ echo ${#highs[@]}
4
$ echo ${highs[0]}
17
$ echo ${highs[1]}
13
$ echo ${highs[2]}
11
$ echo ${highs[3]}
12
$ echo ${highs[@]}
17 13 11 12 Ciao robert
|
harteknut
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2007
Beiträge: 213
|
Jungs, ich bin schwer beeindruckt. 👍 Habe leider grade festgestellt, dass ich keine Arrays verwenden kann, weil ich auf dem Zielsystem (Fritze) nur /bin/sh und kein /bin/bash verwenden kann, und da gehen keine Arrays.
Muss jetzt ohne gehen.
Da in der Datei aber immer vier Werte stehen (ist quasi ein Schieberegister), kann ichs bestimmt auch irgendwie mit temphigh_1, temphigh_2, ... lösen,...
... oder? 😕
|
harteknut
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2007
Beiträge: 213
|
Ahhh! 😲 Die Fritze kann kein cut!
Und auch kein awk. Kann ich Euch dazu überreden mir zu zeigen, wie ich den cut-Teil auch mit egrep oder sed erledigen kann?
Ich komm leider nicht weiter... 😢
So siehts grade aus:
| d='/var/media/ftp/.../wetterdatei.json'
temp_high=$(egrep -o 'tempHigh:[[:space:]]*[[:digit:]]+' $d | egrep -o '[[:digit:]]+'| cut -d ' ' -f 2)
t_max_1=$(echo $temp_high | cut -d ' ' -f 1)
t_max_2=$(echo $temp_high | cut -d ' ' -f 2)
t_max_3=$(echo $temp_high | cut -d ' ' -f 3)
t_max_4=$(echo $temp_high | cut -d ' ' -f 4)
|
Anpassen des Formats ist übrigens leider nicht möglich, die Datei wird von einem externen Skript erzeugt, da kann ich nicht ran. Danke Euch!
Simon
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Kannst Du nicht einfach mit einem for darüber iterieren?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | sh
$ echo "{ location: 'Ort', updated: '13.04.2014 20:46', cityId: 123456,
current: { icon: '33', text: 'Clear', temp: 15, humidity: '41', dewpoint: 2, pressure: 1017, pressureState: 0, windSpeed: 11, windDir: 'W', visibility: 48 },
days: [ {date: '13.04.2014', tempLow: 4, tempHigh: 17, icon: '03', windSpeed: 11, windDir: 'W', windDirDegree: 270 },
{date: '14.04.2014', tempLow: 1, tempHigh: 13, icon: '18', windSpeed: 11, windDir: 'WNW', windDirDegree: 292.5 },
{date: '15.04.2014', tempLow: -1, tempHigh: 11, icon: '06', windSpeed: 6, windDir: 'NNW', windDirDegree: 337.5 },
{date: '16.04.2014', tempLow: 0, tempHigh: 12, icon: '01', windSpeed: 8, windDir: 'E', windDirDegree: 90 } ]
}" > temp.dat
$ temp_high=$(sed -n -e '/.*tempHigh: /p' temp.dat | sed -e 's/.*tempHigh: //g' | sed -e 's/,.*//g')
$ echo $temp_high
17 13 11 12
$ for f in $temp_high
> do
> echo "Temp: " $f
> done
Temp: 17
Temp: 13
Temp: 11
Temp: 12
$
|
|
harteknut
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2007
Beiträge: 213
|
Doch, das geht. Aber ich brauch ja zur Weiterverarbeitung vier verschiedene Variabeln. In der Schleife überschreibe ich sie jedesmal wieder, außer, ich lass den Namen mit hochzählen. Und da bin ich schon wieder überfragt... ☹ Ich habe folgendes gemacht:
Neben der Fritze mit den Wetterdaten steht eine NAS mit Debian Wheezy drauf.
Die holt sich jetzt per cron regelmäßig die Datei mit den Wetterdaten, bereitet sie wie von Euch vorgeschlagen (mit cut, egrep, awk, sed und allem was man so möchte) auf und schiebt sie wieder auf die Fritze. Dort brauch ich dann nur noch cat um die Befehle "abzuspielen".
Klingt ein bisschen kompliziert, ist es auch 😉 Aber es tut! Finde toll, dass Ihr mir so schnell geholfen habt! Und das auch noch am Feiertag... Vielen Dank nochmal,
Simon
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
rklm schrieb: Das ist aber kein gültiges JSON! Normalerweise würde ich ein passendes Werkzeug für JSON nutzen, aber in diesem Fall müssen wir zu anderen greifen. Wenn Du das Format korrigieren kannst, würde ich das immer noch bevorzugen.
Format korrigieren und parsen mit jq (sudo apt-get install jq ) $ cat daten | sed 's!\([a-Z]\{1,\}\):!\"\1\"\:!g' | tr \' \" | jq ".days|.[]|.tempHigh"
17
13
11
12 Grüße Frink
|
okascha
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
harteknut schrieb: Doch, das geht. Aber ich brauch ja zur Weiterverarbeitung vier verschiedene Variabeln. In der Schleife überschreibe ich sie jedesmal wieder, außer, ich lass den Namen mit hochzählen. Und da bin ich schon wieder überfragt... ☹
Hochzählen ist nicht so schwer:
| n=0
for f in $temp_high; do
((++n))
echo "Wert $n: $f"
done
|
Die Frage ist für mich, ob Du wirklich vier verschiedene Variablen brauchst. Die Weiterverarbeitung kannst Du doch in genau so eine Schleife hineinpacken. Die wird dann automatisch für alle Werte durchgeführt. Oder Du definierst Dir eine Funktion und rufst diese dann mit $temp_high als Parameter auf:
| weiterverarbeitung () {
# (was sinnvolles...)
}
weiterverarbeitung $temp_high # $temp_high OHNE Anführungszeichen übergeben
|
Dann könntest Du innerhalb der Funktion die einzelnen Werte mit $1, $2, $3,... ansprechen. Allerdings kann ich das nur für die Bash sicher sagen. Inwieweit /bin/sh sich hier vielleicht anders verhält, ist mir nicht bekannt.
|