holger56779
Anmeldungsdatum: 14. Februar 2018
Beiträge: 37
|
Hallo als kleine Bash Spielerei wollte ich folgendes Skript laufen lassen. Leider geht die die If-Bedingung nicht korrekt, weil er die Zahl nicht korrekt erkennt. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
grenze=$(( 100+0 ))
var=$(GET "https://www.lgl.bayern.de/gesundheit/infektionsschutz/infektionskrankheiten_a_z/coronavirus/karte_coronavirus/csv.htm?tabelle=tabelle4" | grep "nchen Stadt" | cut -d\; -f6 | tr , .)
echo $var
zahl=$(( $var + 0 ))
if [ $zahl -gt $grenze ]; then
echo "wieder home school"
else
echo "Los ins Schulhaus"
fi
|
Es soll die aktuelle Coronazahl von München heruntergeladen werden. Könntet Ihr mir bitte kurz helfen? Ich habe schon verschiedene Googletipps ausprobiert, leider bisher ohne Erfolg.
Vielen Dank
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 58
|
GET ist kein gültiger Befehl. wget oder curl wären z. B. Befehle, mit dem Du die Datei herunterladen kannst. Evtl. musst Du die noch installieren. Die Hilfe, wie man diese Befehle benutzt, findest Du in der man-Page der Befehle. ("man wget" oder "man curl"). @Alle Anderen Ich habe bewusst nicht die fertige Lösung gepostet, damit der TE lernt, sich selbst zu helfen.
|
holger56779
(Themenstarter)
Anmeldungsdatum: 14. Februar 2018
Beiträge: 37
|
Hallo Fork
ich verwende absichtlich GET siehe man GET
| LWP-REQUEST(1p) User Contributed Perl Documentation LWP-REQUEST(1p)
NAME
lwp-request, GET, POST, HEAD - Simple command line user agent
SYNOPSIS
lwp-request [-afPuUsSedvhx] [-m method] [-b base URL] [-t timeout]
[-i if-modified-since] [-c content-type]
[-C credentials] [-p proxy-url] [-o format] url...
DESCRIPTION
|
Meine Zeile 12 geht nicht korrekt, weil der Vergleich "-gt" nicht geht. | bash: 155.37 + 0 : Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist ».37 + 0 «).
|
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 58
|
ich verwende absichtlich GET
Danke! Das kannte ich noch gar nicht! Ansonsten: Bash kann keine Floating-Point Arithmetik. Das gilt wohl auch für den Vergleich. bc könnte helfen. Ansonsten gibt's hier noch mehr Optionen dazu: https://unix.stackexchange.com/a/40787
|
holger56779
(Themenstarter)
Anmeldungsdatum: 14. Februar 2018
Beiträge: 37
|
So geht es endlich, aber gibt's das nicht noch einfacher? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
grenze=100
var=$(GET "https://www.lgl.bayern.de/gesundheit/infektionsschutz/infektionskrankheiten_a_z/coronavirus/karte_coronavirus/csv.htm?tabelle=tabelle4" | grep "nchen Stadt" | cut -d\; -f6 | tr , .)
echo $var
zahl=$var
if [ $(echo "$zahl > $grenze" | bc) -eq 1 ]; then
echo "wieder home school"
else
echo "Los ins Schulhaus"
fi
|
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 58
|
- Du kannst natürlich auch die Nachkommastellen einfach ignorieren/abschneiden ${zahl%%....} (→ man bash) - Statt einer Verkettung von vielen Befehlen, die alle einen eigenen Prozess erzeugen, empfehle ich auch mal einen awk-Einzeiler, der macht alles was eine längere Befehlskette macht in einem Aufruf. |
# original
var=$(GET "$url" | grep "nchen Stadt" | cut -d\; -f6 | tr , .)
# var=155.13
# vorschlag
var=$(GET "$url" | awk -F';' '/chen Stadt/ {split($6,r,",");print r[1]}'
# var=155
|
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 960
|
Hallo holger56779, wesentlich einfacher geht es nicht, als das was du geschrieben hast. Aber die Frage erinnert mich an die früheren 70er, als die APL Gurus sich auch darin übertrafen den kürzesten (unübersichtlichtesten) Code zu schreiben. Ich habe deine Aufgabe aber hier auch mal in einem 1-Zeiler geschrieben:
grenze="100.0";if [ $( printf "%s > $grenze\n" <<< echo $(GET "https://www.lgl.bayern.de/gesundheit/infektionsschutz/infektionskrankheiten_a_z/coronavirus/karte_coronavirus/csv.htm?tabelle=tabelle4" | grep "nchen Stadt" | cut -d\; -f6 | tr , . ) | bc ) -eq 1 ]; then echo "wieder home school"; else echo "Los ins Schulhaus"; fi
Viel Spass!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Denk dran, dass
Generell: Jeweils am Freitag jeder Woche erfolgt die maßgebliche Inzidenzeinstufung nach dem jeweils aktuellen Stand der Veröffentlichung des Robert-Koch-Instituts. Die für den Inzidenzbereich maßgebliche Regelung gilt dann für die darauffolgende Kalenderwoche von Montag bis zum Ablauf des folgenden Sonntags.
bzw. https://www.muenchen.de/rathaus/Stadtverwaltung/Referat-fuer-Bildung-und-Sport/Schule/corona.html: Die jeweilige Unterrichtsform wird jeden Freitag für die kommende Schulwoche festgelegt, auch wenn sich der Inzidenzwert während der Woche ändert. Für die Schulwoche vom 19. bis 23. April 2021 gelten demnach die Vorgaben für einen Inzidenzwert von über 100.
Also wäre das vermutlich die sinnvollere Möglichkeit mit python3-pandas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | #!/usr/bin/env python3
from datetime import datetime, timedelta
import requests
import pandas as pd
from io import BytesIO
LIMIT = 100
LOCATION = "SK München"
r = requests.get('https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Daten/Fallzahlen_Kum_Tab.xlsx?__blob=publicationFile')
r.raise_for_status()
raw_data = BytesIO(r.content)
data = pd.read_excel(raw_data, sheet_name='LK_7-Tage-Inzidenz', skiprows=4)
# get friday, one week ago, midnight
current_time = datetime.now()
last_friday = (current_time.date()
- timedelta(days=current_time.weekday())
+ timedelta(days=4, weeks=-1, hours=0, minutes=0))
last_friday = datetime.combine(last_friday, datetime.min.time())
date_str = last_friday.strftime("%d.%m.%Y")
# only a part of the dates are actually date formatted cells, some are strings - D'oh!
try:
incidence = float(data[data['LK'] == LOCATION][last_friday])
except KeyError:
incidence = float(data[data['LK'] == LOCATION][date_str])
print(f"7-Tage Inzidenz am {date_str} in {LOCATION}: {incidence:.2f}")
if incidence > LIMIT:
print("Home Schooling")
else:
print("Back to School")
|
|
holger56779
(Themenstarter)
Anmeldungsdatum: 14. Februar 2018
Beiträge: 37
|
Herzlichen Dank für Eure Hilfe und Vorschläge. Ich freue mich, dass ich Euch motivieren konnte. Ich habe noch eine Dialog Variante gemacht.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #!/bin/bash
clear
grenze=100
var=$(GET "https://www.lgl.bayern.de/gesundheit/infektionsschutz/infektionskrankheiten_a_z/coronavirus/karte_coronavirus/csv.htm?tabelle=tabelle4" | grep "nchen Stadt" | cut -d\; -f6 | tr , .)
echo $var
#dialog --clear --msgbox "$(tail -n 5 text.txt)" 15 40
if [ $(echo "$var > $grenze" | bc) -eq 1 ]; then
dialog --clear --msgbox "$var => home school" 5 25
else
dialog --clear --msgbox "$var => Los ins Schulhaus" 5 30
fi
clear
|
die Schulöffnung nicht an den Zahlen des LGL, sondern an denen des RKI hängt
Es ist doch komisch, dass man nach über einem Jahr immer noch unterschiedliche Zahlen hat. das ist ein hübsch-hässliches Excel-Dokument....
Gibt es einen Linux-Shell Befehl um eine Exceldatei auszulesen?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
holger56779 schrieb: Es ist doch komisch, dass man nach über einem Jahr immer noch unterschiedliche Zahlen hat.
Das ist immer das Problem, wenn jeder seine eigene Berechnungsmethode hat, mit Doppelten Meldungen und deren Korrekturen unterschiedlich umgegangen wird usw. ... das ist ein hübsch-hässliches Excel-Dokument....
Gibt es einen Linux-Shell Befehl um eine Exceldatei auszulesen?
ssconvert aus dem gnumeric-Paket kann das zum Beispiel - das ist halt etwas lästiger, weil man im Gegensatz zu einem Pandas Dataframe nicht einfach Zeilen und Spalten selektieren kann, sich um die Locale-Einstellungen kümmern muss, damit die Dezimaltrennzeichen nicht mit den Feldtrennern kollidieren usw.: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | #!/usr/bin/bash
limit=100
today="$(date +%Y-%m-%d)"
xslx_file="rki_fallzahlen_${today}.xslx"
if [ ! -f "$xslx_file" ]
then
curl -s 'https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Daten/Fallzahlen_Kum_Tab.xlsx?__blob=publicationFile' > "$xslx_file"
LANG="en_US.UTF-8" ssconvert --export-file-per-sheet "$xslx_file" "%s.csv"
fi
IFS="," dates=( $(sed -ne '/^,LK,LKNR/p' "LK_7-Tage-Inzidenz.csv") )
IFS="," fields=( $(sed -ne '/SK München/p' "LK_7-Tage-Inzidenz.csv") )
last_friday_1="$(date -d "last friday" +%d.%m.%Y)"
last_friday_2="$(date -d "last friday" +%Y/%m/%d)"
for (( n=${#dates[@]}; n > 0; --n ))
do
echo checking field $n: "${dates[$n]}: ${fields[$n]}"
echo 'grep -q' "$last_friday" '<<<' "${dates[n]}"
if grep -q "${last_friday_1}\|${last_friday_2}" <<< "${dates[n]}"
then
echo "${fields[$n]}"
value=$(sed 's/"//g;s/\.[[:digit:]]\+$//g' <<< "${fields[$n]}")
if [ "$value" -gt "$limit" ]
then
echo "Home Schooling"
else
echo "Back to School"
fi
exit
fi
done
|
|