Am Fr, 20 Apr 2012 14:11:16 CEST schrieb David Haller: Hallo David,
Am Thu, 19 Apr 2012, ?l ??gn?r schrieb:
Am Do, 19 Apr 2012 05:58:14 CEST schrieb David Haller:
Alternativ könntest du auch awk nach dem Trekking filtern lassen, wo kommt das denn vor in der Datei? Immer vor <desc>?
Anscheinend immer danach.
Zur Zeit schon, aber Oruxmaps entwickelt sich und man weiß nie was den Entwicklern einfällt ;-)
[..]
Ich schick dir Beispieldateien per PM und ich bin mir nicht sicher, ob man sich darauf verlassen sollte, ob es davor oder danach steht.
Könntest du das bitte noch ein bisschen modifizieren, ich kenne mich mit mit gawk zu wenig aus. Vielleicht ist folgendes möglich: # Aufruf: ./trekking.awk [-vU=1] *.gpx Kann man den Suchbegriff als Option angeben und wenn kein Begriff angegeben wurde, dann wird automatisch trekking verwendet. Auch würde ich es gerne mit find verbinden, dh es sollen alle Unterordner eines Verzeichnisses nach gpx durchsucht werden. Es gibt da zB bei Oruxmaps noch weitere "track types" wie Mountain Biking (also 2 Worte mit Leerzeichen) Radfahren (Strasse) Walking Unbestimmt und viele weitere Typen In der Regel werde ich Trekking (für das Trekkingfahrrad) verwenden, aber die oben genannten werden auch vorkommen und vielleicht kann man das ja gleich berücksichtigen. Also Aufruf ohne Option summiert Trecking, Aufruf mit Option summiert den angegebenen "track type". # LOL, habe mich extra bemüht kein cat zu verwenden, obwohl ich vorher die Datei mit cat angesehen habe ;-) "type" kann also mehrmals in _1_ Datei vorkommen grep -i type *.gpx 2012-04-20 1514__20120420_1514.gpx:<type>Startpunkt</type> 2012-04-20 1514__20120420_1514.gpx:<type>Endpunkt</type> 2012-04-20 1514__20120420_1514.gpx:<type>Walking</type> 2012-04-20 1851__20120420_1851.gpx:<type>Startpunkt</type> 2012-04-20 1851__20120420_1851.gpx:<type>Endpunkt</type> 2012-04-20 1851__20120420_1851.gpx:<type>Walking</type> Ich schick dir die Files per PM. Da sind auch "kaputte" Files dabei, wo die Aufzeichnung abgebrochen wurde. Vielleicht muss man dann awk doch in ein Shellscript packen?
==== [etwas kompakt formatiert, geht auch besser] ==== #!/usr/bin/gawk -f # Aufruf: ./trekking.awk [-vU=1] *.gpx BEGIN { ### -vU=1 -> "<type>Ungestimmt" mitsummieren, ggfs. kann man den ### default hier ändern, dann z.B. mit -vU=0 "nicht mitsummieren _sum_unbestimmt = U != "" ? U : 0; } ### Achtung, hier kommt's auf die Reihenfolge an, dieser Block muß ### mind. VOR dem got_type == 1 && got_desc == 1 Block kommen! FILENAME != _oldfilename { if(trekking == 1) { sum += d; } trekking = got_desc = got_type = 0; _oldfilename = FILENAME; } /<type>Trekking/ { got_type = 1; trekking = 1; } /<type>Unbestimmt/ { got_type = 1; if(_sum_unbestimmt == 1) { trekking = 1; } nextfile; } /<desc>.*<p>Distanz:/ { got_desc = 1; d = gensub(/.*<p>Distanz: *([0-9,.]+) *k?m.*/, "\\1", 1, $0); gsub(",", ".", d); } got_type == 1 && got_desc == 1 { ### wenn type und desc gelesen, Rest überspringen, summiert ### wird im FILENAME != .. bzw. im END Block nextfile; } END { if(trekking == 1) { sum += d; } printf("%f\n", sum); } ====
Das solltest robust sein (Reihenfolge type/desc egal), und relativ schnell,
Schnell ist völlig egal, mich interessieren die Werte nur alle paar Monate bzw. 1x im Jahr. Ich bin einfach gespannt, wieviel km ich über das Jahr mit Kurzstrecken zusammenbringe.
wenn type und desc gefunden sind wird der (recht große) Rest der Datei übersprungen.
Der wird in der Praxis noch viel größer sein, bis jetzt sind das irgendwelche Testdateien.
Wenn du das Script z.B. als 'sum_gpx_dest.awk' ablegst und ausführbar machst ist dann der Aufruf z.B.:
./sum_gpx_dest.awk *.gpx oder ./sum_gpx_dest.awk -vU=1 *.gpx
Interessant ist auch die Datumsfilterung, also zB das ganze Jahr, oder ein Monat. Kann awk mit einer Wildcard umgehen? Der Dateiaufbau ist ja Datum und Zeit, seltsamerweise gleich 2x 2012-04-17 1706__20120417_1706.gpx
Mit deinen Testdateien tut's jedenfalls ;)
Danke für das Testen. Ich brauche noch ein paar Tage bis ich neue Testdateien habe, die nur Meter enthalten.
Achso, die Einheit der Distanz wird jetzt ignoriert, alle Dateien müssen also die gleiche haben.
Ist klar, man darf nur nicht vergessen von km auf m umzustellen ;-)
Bei Bedarf könne man noch recht einfach die Einheit parsen und z.B. alles auf Meter umrechnen und die Ausgabe z.B. ab 1000m in km ausgeben, sonst als Meter ;)
Wenn wir schon beim Optimieren sind, dann wäre eine automatische Umrechnung auf Meter für die Summierung wünschenswert, falls km verwendet wird. Die Ausgabe der Summe, aber in km. Bei mir läuft das Skript mit den neuen Testdateien nicht. Ich schick dir mehr dazu per PM. -- Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org