Bash-Skript: Löschen mit sed, Summenbildung
Vorbemerkung: Es geht vorerst nur um einen simplen Fahrrad-Kilometerzähler, der mit dem GPS eines Android-Handys realisiert werden soll. Ich denke Oruxmaps könnte dafür geeignet sein, da man damit automatisch nach Beenden eines Tracks eine gpx-Datei erstellen kann, die dann wiederum per rsync-Script auf den PC kopiert werden kann. Bessere Ideen sind willkommen, die Lösung des Beispiels interessiert mich aber auf jeden Fall. Die Beispieldaten sind von den Werten nicht realistisch, da es sich um keine Aufzeichnungen mit dem Rad handelt, sollte aber egal sein. cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Trekking</type> Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso. Um die Kilometer abzufragen, brauche ich den Wert hinter <p>Distanz: Wie extrahiere ich am einfachsten nur die km? Mit sed? #Leerzeilen für bessere Lesbarkeit eingefügt cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i distanz <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:06</h2><br /><p>Startzeit: 04/17/2012 17:06</p><p>Zielzeit: 04/17/2012 17:06</p><p>Distanz: 0 km (00:00)</p><p>Bewegungszeit: 00:00</p><p>Durchschnitts-Geschw.: 0 km/h</p><p>Netto Geschwindigkeit: 0 km/h</p><p>Max. Geschwindigkeit: 0 km/h</p><p>Minimale Höhe: 467 m</p><p>Maximale Höhe: 467 m</p><p>Aufstieg: 0 m</p><p>Abstieg: 0 m</p><p>Steigzeit: 00:00</p><p>Sinkzeit: 00:00</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:07</h2><br /><p>Startzeit: 04/17/2012 17:07</p><p>Zielzeit: 04/17/2012 17:08</p><p>Distanz: 0,4 km (00:01)</p><p>Bewegungszeit: 00:00</p><p>Durchschnitts-Geschw.: 21,5 km/h</p><p>Netto Geschwindigkeit: 95,6 km/h</p><p>Max. Geschwindigkeit: 36 km/h</p><p>Minimale Höhe: 474 m</p><p>Maximale Höhe: 479 m</p><p>Aufstieg: 3 m</p><p>Abstieg: 0 m</p><p>Steigzeit: 00:00</p><p>Sinkzeit: 00:00</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:11</h2><br /><p>Startzeit: 04/17/2012 17:11</p><p>Zielzeit: 04/17/2012 17:21</p><p>Distanz: 1,7 km (00:09)</p><p>Bewegungszeit: 00:06</p><p>Durchschnitts-Geschw.: 10,9 km/h</p><p>Netto Geschwindigkeit: 16,4 km/h</p><p>Max. Geschwindigkeit: 36,9 km/h</p><p>Minimale Höhe: 463 m</p><p>Maximale Höhe: 495 m</p><p>Steig-Geschw.: 281,8 m/h</p><p>Sink-Geschw.: -556,3 m/h</p><p>Aufstieg: 27 m</p><p>Abstieg: -15 m</p><p>Steigzeit: 00:05</p><p>Sinkzeit: 00:01</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-18 14:32</h2><br /><p>Startzeit: 04/18/2012 14:32</p><p>Zielzeit: 04/18/2012 17:11</p><p>Distanz: 4,9 km (02:26)</p><p>Bewegungszeit: 01:38</p><p>Durchschnitts-Geschw.: 2 km/h</p><p>Netto Geschwindigkeit: 3 km/h</p><p>Max. Geschwindigkeit: 25,2 km/h</p><p>Minimale Höhe: 459 m</p><p>Maximale Höhe: 501 m</p><p>Steig-Geschw.: 27 m/h</p><p>Sink-Geschw.: -157,7 m/h</p><p>Aufstieg: 48 m</p><p>Abstieg: -66 m</p><p>Steigzeit: 01:47</p><p>Sinkzeit: 00:25</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012-04-18\ 1432__20120418_1432.gpx | grep -i distanz | sed -e '/<desc>/,/Distanz:/d' Das löscht mir leider nicht den Text von <desc> bis Distanz: Nehmen wir nun an, dass die km-Werte dann nur aus Zahlen in einer Variable zur Verfügung stehen, also zB 0 0,4 1,7 4,9 Wie summiere ich die einzelnen Werte am besten? -- Α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
Lieber Al, ich geh mal davon aus, dass Dein gepostetes Ergebnis aus lauter einzelnen langen Zeilen besteht. Dann hilft dies um die Kilometer hinter Distanz aufzusummieren (nach Deiner Pipe): | sed -e 's/.*[dD]istanz: \([^ ]*\) km.*/\1/' -e 's/,/./' -e '/^ *$/d' | awk '{ sum += $1 } END { print sum }' Am Mittwoch, den 18.04.2012, 18:28 +0200 schrieb Аl Воgnеr:
Vorbemerkung: Es geht vorerst nur um einen simplen Fahrrad-Kilometerzähler, der mit dem GPS eines Android-Handys realisiert werden soll. Ich denke Oruxmaps könnte dafür geeignet sein, da man damit automatisch nach Beenden eines Tracks eine gpx-Datei erstellen kann, die dann wiederum per rsync-Script auf den PC kopiert werden kann. Bessere Ideen sind willkommen, die Lösung des Beispiels interessiert mich aber auf jeden Fall.
Die Beispieldaten sind von den Werten nicht realistisch, da es sich um keine Aufzeichnungen mit dem Rad handelt, sollte aber egal sein.
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Trekking</type>
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
for file in `grep -l '<type>Trekking</type>'` do echo $file ... done
Um die Kilometer abzufragen, brauche ich den Wert hinter <p>Distanz: Wie extrahiere ich am einfachsten nur die km? Mit sed?
#Leerzeilen für bessere Lesbarkeit eingefügt cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i distanz
<desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:06</h2><br /><p>Startzeit: 04/17/2012 17:06</p><p>Zielzeit: 04/17/2012 17:06</p><p>Distanz: 0 km (00:00)</p><p>Bewegungszeit: 00:00</p><p>Durchschnitts-Geschw.: 0 km/h</p><p>Netto Geschwindigkeit: 0 km/h</p><p>Max. Geschwindigkeit: 0 km/h</p><p>Minimale Höhe: 467 m</p><p>Maximale Höhe: 467 m</p><p>Aufstieg: 0 m</p><p>Abstieg: 0 m</p><p>Steigzeit: 00:00</p><p>Sinkzeit: 00:00</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc>
<desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:07</h2><br /><p>Startzeit: 04/17/2012 17:07</p><p>Zielzeit: 04/17/2012 17:08</p><p>Distanz: 0,4 km (00:01)</p><p>Bewegungszeit: 00:00</p><p>Durchschnitts-Geschw.: 21,5 km/h</p><p>Netto Geschwindigkeit: 95,6 km/h</p><p>Max. Geschwindigkeit: 36 km/h</p><p>Minimale Höhe: 474 m</p><p>Maximale Höhe: 479 m</p><p>Aufstieg: 3 m</p><p>Abstieg: 0 m</p><p>Steigzeit: 00:00</p><p>Sinkzeit: 00:00</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc>
<desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-17 17:11</h2><br /><p>Startzeit: 04/17/2012 17:11</p><p>Zielzeit: 04/17/2012 17:21</p><p>Distanz: 1,7 km (00:09)</p><p>Bewegungszeit: 00:06</p><p>Durchschnitts-Geschw.: 10,9 km/h</p><p>Netto Geschwindigkeit: 16,4 km/h</p><p>Max. Geschwindigkeit: 36,9 km/h</p><p>Minimale Höhe: 463 m</p><p>Maximale Höhe: 495 m</p><p>Steig-Geschw.: 281,8 m/h</p><p>Sink-Geschw.: -556,3 m/h</p><p>Aufstieg: 27 m</p><p>Abstieg: -15 m</p><p>Steigzeit: 00:05</p><p>Sinkzeit: 00:01</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc>
<desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-18 14:32</h2><br /><p>Startzeit: 04/18/2012 14:32</p><p>Zielzeit: 04/18/2012 17:11</p><p>Distanz: 4,9 km (02:26)</p><p>Bewegungszeit: 01:38</p><p>Durchschnitts-Geschw.: 2 km/h</p><p>Netto Geschwindigkeit: 3 km/h</p><p>Max. Geschwindigkeit: 25,2 km/h</p><p>Minimale Höhe: 459 m</p><p>Maximale Höhe: 501 m</p><p>Steig-Geschw.: 27 m/h</p><p>Sink-Geschw.: -157,7 m/h</p><p>Aufstieg: 48 m</p><p>Abstieg: -66 m</p><p>Steigzeit: 01:47</p><p>Sinkzeit: 00:25</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc>
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012-04-18\ 1432__20120418_1432.gpx | grep -i distanz | sed -e '/<desc>/,/Distanz:/d'
Das löscht mir leider nicht den Text von <desc> bis Distanz:
Nehmen wir nun an, dass die km-Werte dann nur aus Zahlen in einer Variable zur Verfügung stehen, also zB
0 0,4 1,7 4,9
Wie summiere ich die einzelnen Werte am besten?
-- Αl
-- Beste Gruesse Christoph Stockmayer --------------------------------------------------- Ingenieurbuero Christoph Stockmayer GmbH Dipl.Ing. Chr. Stockmayer SCLT, CNI, LPIC1, CLA Dreihoehenstr. 1 90571 Schwaig Tel: 0911/505241 Fax: 0911/5009584 eMail: sto@stockmayer.de, christoph.stockmayer@gmx.de ePost: christoph.stockmayer@epost.de WWW: www.stockmayer.de, www.stockmayer.eu Geschaeftsfuehrer: Christoph Stockmayer HRB 1290, Bad Hersfeld, Abt. Rotenburg --------------------------------------------------- -- 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
Am Mi, 18 Apr 2012 20:14:30 CEST schrieb Christoph Stockmayer: Hallo Christoph,
ich geh mal davon aus, dass Dein gepostetes Ergebnis aus lauter einzelnen langen Zeilen besteht.
Ja, cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx holt aus jeder gpx-Datei genau 1 sehr lange Zeile mit Distanz
Dann hilft dies um die Kilometer hinter Distanz aufzusummieren (nach Deiner Pipe):
| sed -e 's/.*[dD]istanz: \([^ ]*\) km.*/\1/' -e 's/,/./' -e '/^ *$/d' | awk '{ sum += $1 } END { print sum }'
cat 2012*.gpx | \ sed -e 's/.*[dD]istanz: \([^ ]*\) km.*/\1/' -e 's/,/./' -e '/^ *$/d' | \ awk '{ sum += $1 } END { print sum }' 7 0 0,4 1,7 4,9 Das sieht schon mal sehr gut aus! Danke!
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
for file in `grep -l '<type>Trekking</type>'` do echo $file ... done
Ich denke, da werden noch Alternativen kommen, da for problematisch sein kann, speziell, wenn im Dateinamen Leerzeichen erhalten sind. Aber das ist mein geringstes Problem. Ich denke da eher in diese Richtung find "$SOURCEDIR" -type f -name '*.gpx' | sort | \ while read -r GPXFILE; do ... done -- Α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
Hi Al, ich dachte, der Inhalt sollte <type>Trekking</type> sein? Dann wäre vielleicht folgende Kombination möglich: find "$SOURCEDIR" -type f -name '*.gpx' -exec grep '<type>Trekking</type>' {} \; | sort | \ while read -r GPXFILE; do ... done
Ich denke, da werden noch Alternativen kommen, da for problematisch sein kann, speziell, wenn im Dateinamen Leerzeichen erhalten sind. Aber das ist mein geringstes Problem.
Ich denke da eher in diese Richtung
find "$SOURCEDIR" -type f -name '*.gpx' | sort | \ while read -r GPXFILE; do ... done
-- Αl
-- Beste Gruesse Christoph Stockmayer --------------------------------------------------- Ingenieurbuero Christoph Stockmayer GmbH Dipl.Ing. Chr. Stockmayer SCLT, CNI, LPIC1, CLA Dreihoehenstr. 1 90571 Schwaig Tel: 0911/505241 Fax: 0911/5009584 eMail: sto@stockmayer.de, christoph.stockmayer@gmx.de ePost: christoph.stockmayer@epost.de WWW: www.stockmayer.de, www.stockmayer.eu Geschaeftsfuehrer: Christoph Stockmayer HRB 1290, Bad Hersfeld, Abt. Rotenburg --------------------------------------------------- -- 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
Am Do, 19 Apr 2012 07:37:22 CEST schrieb Christoph Stockmayer: Hallo Christoph,
ich dachte, der Inhalt sollte <type>Trekking</type> sein?
Ja, aber ich bin mir noch nicht ganz sicher, was ich alles auswerten will. Primär geht es um die Summe aller Strecken der gpx-Files.
Dann wäre vielleicht folgende Kombination möglich: find "$SOURCEDIR" -type f -name '*.gpx' -exec grep '<type>Trekking</type>' {} \; | sort | \ while read -r GPXFILE; do ... done
Ich denke, das ist die Variante, wenn es um mehr als die Summe (Kilometer) geht. BTW, ich habe auf Meter in Oruxmaps umgestellt, sonst wird vielleicht zu viel gerundet. Ich habe aber noch keine Testdateien, eventuell bedarf das dann kleiner Änderungen. Jedenfalls danke, ich bin schon deutlich weiter. Nun muss ich mir vor allem klar werden, was ich alles will bzw. für mich sinnvoll ist. -- Α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
Hallo, Am Wed, 18 Apr 2012, ?l ??gn?r schrieb:
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Trekking</type>
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
grep -l '<type>Trekking' *.gpx | xargs
Um die Kilometer abzufragen, brauche ich den Wert hinter <p>Distanz: Wie extrahiere ich am einfachsten nur die km? Mit sed? [..] <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-18 14:32</h2><br /><p>Startzeit: 04/18/2012 14:32</p><p>Zielzeit: 04/18/2012 17:11</p><p>Distanz: 4,9 km (02:26)</p><p>Bewegungszeit: 01:38</p><p>Durchschnitts-Geschw.: 2 km/h</p><p>Netto Geschwindigkeit: 3 km/h</p><p>Max. Geschwindigkeit: 25,2 km/h</p><p>Minimale Höhe: 459 m</p><p>Maximale Höhe: 501 m</p><p>Steig-Geschw.: 27 m/h</p><p>Sink-Geschw.: -157,7 m/h</p><p>Aufstieg: 48 m</p><p>Abstieg: -66 m</p><p>Steigzeit: 01:47</p><p>Sinkzeit: 00:25</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> [..] Wie summiere ich die einzelnen Werte am besten?
$ awk '/<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END{ printf("%f\n", sum); }' *.gpx 7.000000 HTH, -dnh -- Things should be as simple as possible, but not simpler. -- Albert Einstein -- 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
Am Mi, 18 Apr 2012 23:30:01 CEST schrieb David Haller: Hallo David,
Am Wed, 18 Apr 2012, ?l ??gn?r schrieb:
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Unbestimmt</type> <type>Trekking</type>
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
grep -l '<type>Trekking' *.gpx | xargs
Um die Kilometer abzufragen, brauche ich den Wert hinter <p>Distanz: Wie extrahiere ich am einfachsten nur die km? Mit sed? [..] <desc><![CDATA[<h1>OruxMaps</h1><br /><hr align="center" width="480" style="height: 2px; width: 517px"/><h2>Name: 2012-04-18 14:32</h2><br /><p>Startzeit: 04/18/2012 14:32</p><p>Zielzeit: 04/18/2012 17:11</p><p>Distanz: 4,9 km (02:26)</p><p>Bewegungszeit: 01:38</p><p>Durchschnitts-Geschw.: 2 km/h</p><p>Netto Geschwindigkeit: 3 km/h</p><p>Max. Geschwindigkeit: 25,2 km/h</p><p>Minimale Höhe: 459 m</p><p>Maximale Höhe: 501 m</p><p>Steig-Geschw.: 27 m/h</p><p>Sink-Geschw.: -157,7 m/h</p><p>Aufstieg: 48 m</p><p>Abstieg: -66 m</p><p>Steigzeit: 01:47</p><p>Sinkzeit: 00:25</p><hr align="center" width="480" style="height: 2px; width: 517px"/>]]></desc> [..] Wie summiere ich die einzelnen Werte am besten?
$ awk '/<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END{ printf("%f\n", sum); }' *.gpx 7.000000
grep -l '<type>Trekking' *.gpx | xargs Mir ist noch nicht so recht klar wie ich mit xargs dann deine awk-Konstrukt aufrufe. Wenn du willst, dann schicke ich dir 3 Beispiel gpx-Dateien zum Testen zu. -- Α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
Hallo, Am Thu, 19 Apr 2012, ?l ??gn?r schrieb:
Am Mi, 18 Apr 2012 23:30:01 CEST schrieb David Haller:
Am Wed, 18 Apr 2012, ?l ??gn?r schrieb:
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
grep -l '<type>Trekking' *.gpx | xargs [..]
Wie summiere ich die einzelnen Werte am besten?
$ awk '/<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END{ printf("%f\n", sum); }' *.gpx 7.000000
grep -l '<type>Trekking' *.gpx | xargs
Mir ist noch nicht so recht klar wie ich mit xargs dann deine awk-Konstrukt aufrufe.
grep -FZl '<type>Trekking' *.gpx | xargs -r -0 awk ... (-F wg. Performance, -Z / xargs -r0 wg. Robustheit ggü. komischer Dateinamen). Alternativ könntest du auch awk nach dem Trekking filtern lassen, wo kommt das denn vor in der Datei? Immer vor <desc>? awk ' /<type>Trekking/ { trekking = 1; } /<type>Unbestimmt/ { nextfile; } ### nur falls <type> nur einmal pro ### Datei vorkommt /<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END { printf("%f\n", sum); }' *.gpx Und wenn nicht: awk ' /<type>Trekking/ { trekking = 1; } /<type>Unbestimmt/ { nextfile; } ### nur falls <type> nur einmal pro ### Datei vorkommt /<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/, "\\1", 1, $0); gsub(",", ".", d); } FILENAME != _oldfilename && trekking == 1 { sum += d; _oldfilename = FILENAME; } END { printf("%f\n", sum); }' *.gpx Alles ungetestet. Möglicherweise ist grep + awk bzw. grep -F + awk schneller als awk alleine. Achso, das obige dann in ein awk-Script giessen: ==== /usr/bin/gawk -f /<type>Trekking/ { trekking = 1; } [..] END { ..; } ==== chmod 700, in den PATH legen (z.B. nach ~/bin/) und aufrufen ;) Evtl. mußt du in der Datei noch das \\1 durch \1 ersetzen, ich vergess immer, wie man das schreibenn muß. HTH, -dnh -- [ls?] command not found? [..] Das ist ein kleiner Ludwig, gefolgt von einem kleinen Siegfried (zwei muntere Recken, die auszogen, den Drachen zu schrecken). Keine Ida, denn Burgfräulein haben in Heldenrunden nix verloren. Mach einfach mal nur ls (Ludwig-Siegfried, nicht Ida-Siegfried, das könnte unanständig werden *g*), [..] -- Philipp Zacharias in suse-linux -- 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
Am Do, 19 Apr 2012 05:58:14 CEST schrieb David Haller: Hallo David,
Am Thu, 19 Apr 2012, ?l ??gn?r schrieb:
Am Mi, 18 Apr 2012 23:30:01 CEST schrieb David Haller:
Am Wed, 18 Apr 2012, ?l ??gn?r schrieb:
Was wäre die einfachste Methode um nur gpx-Dateien mit zB <type>Trekking</type> auszuwählen? Geht das nur mit einer Schleife? Aber vermutlich braucht man die sowieso.
grep -l '<type>Trekking' *.gpx | xargs [..]
Wie summiere ich die einzelnen Werte am besten?
$ awk '/<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END{ printf("%f\n", sum); }' *.gpx 7.000000
grep -l '<type>Trekking' *.gpx | xargs
Mir ist noch nicht so recht klar wie ich mit xargs dann deine awk-Konstrukt aufrufe.
grep -FZl '<type>Trekking' *.gpx | xargs -r -0 awk ...
(-F wg. Performance, -Z / xargs -r0 wg. Robustheit ggü. komischer Dateinamen).
Alternativ könntest du auch awk nach dem Trekking filtern lassen, wo kommt das denn vor in der Datei? Immer vor <desc>?
awk ' /<type>Trekking/ { trekking = 1; } /<type>Unbestimmt/ { nextfile; } ### nur falls <type> nur einmal pro ### Datei vorkommt /<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/,"\\1",1,$0); gsub(",",".",d); sum+=d; } END { printf("%f\n", sum); }' *.gpx
Und wenn nicht:
awk ' /<type>Trekking/ { trekking = 1; } /<type>Unbestimmt/ { nextfile; } ### nur falls <type> nur einmal pro ### Datei vorkommt /<desc>.*<p>Distanz:/ { d = gensub(/.*<p>Distanz: *([0-9,.]+) *km.*/, "\\1", 1, $0); gsub(",", ".", d); } FILENAME != _oldfilename && trekking == 1 { sum += d; _oldfilename = FILENAME; } END { printf("%f\n", sum); }' *.gpx
Alles ungetestet. Möglicherweise ist grep + awk bzw. grep -F + awk schneller als awk alleine. Achso, das obige dann in ein awk-Script giessen:
==== /usr/bin/gawk -f /<type>Trekking/ { trekking = 1; } [..] END { ..; } ====
chmod 700, in den PATH legen (z.B. nach ~/bin/) und aufrufen ;) Evtl. mußt du in der Datei noch das \\1 durch \1 ersetzen, ich vergess immer, wie man das schreibenn muß.
HTH, -dnh
Ich schick dir Beispieldateien per PM und ich bin mir nicht sicher, ob man sich darauf verlassen sollte, ob es davor oder danach steht. -- Α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
Hallo, 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. [..]
Ich schick dir Beispieldateien per PM und ich bin mir nicht sicher, ob man sich darauf verlassen sollte, ob es davor oder danach steht.
==== [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, wenn type und desc gefunden sind wird der (recht große) Rest der Datei übersprungen. 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 Mit deinen Testdateien tut's jedenfalls ;) Achso, die Einheit der Distanz wird jetzt ignoriert, alle Dateien müssen also die gleiche haben. 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 ;) HTH, -dnh -- Persönliche Daten sind wie Plutonium. Wenn zuviele davon auf einem Haufen liegen, wird es kritisch. -- Dirk Engeling, CCC -- 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
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
Аl Воgnеr schrieb: [...]
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type
Hallo Al, gib es zu, das machst Du nur um David mal wieder auf die Palme zu bringen :) Vergiss endlich dieses cat, glaub mir, Du brauchst es nicht :) fröhliche Grüsse Bernd (Der schon popcorn und bier parat hatte und nun enttäuscht ist, weil David so ruhig bleibt...) -- Gruss Bernd -- 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
Am Do, 19 Apr 2012 00:24:16 CEST schrieb Bernd Obermayr:
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type
Hallo Al, gib es zu, das machst Du nur um David mal wieder auf die Palme zu bringen :) Vergiss endlich dieses cat, glaub mir, Du brauchst es nicht :)
Sorry, das kommt vom Probieren. Gerade das ist ein gutes Beispiel. Der Pfad ist so lange und da kann man den Suchtext am Ende in der Konsole viel schneller editieren / variieren. Grundsätzlich ist mir das schon klar ;-) Wenn ich es mal richtig mache, dann stelle ich das bald um, wenn ich noch am probieren bin, was ich überhaupt genau will. Im Skript wird das schon korrigiert, außer ich übersehe es dann. -- Α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
Hi Leute, ich beginn tatsächlich auch gerne mit cat - kann man dann später leichter weitere Kommandos in die Pipe einbauen ... Am Donnerstag, den 19.04.2012, 01:09 +0200 schrieb Аl Воgnеr:
Am Do, 19 Apr 2012 00:24:16 CEST schrieb Bernd Obermayr:
cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | grep -i type
Hallo Al, gib es zu, das machst Du nur um David mal wieder auf die Palme zu bringen :) Vergiss endlich dieses cat, glaub mir, Du brauchst es nicht :)
Sorry, das kommt vom Probieren. Gerade das ist ein gutes Beispiel. Der Pfad ist so lange und da kann man den Suchtext am Ende in der Konsole viel schneller editieren / variieren. Grundsätzlich ist mir das schon klar ;-) Wenn ich es mal richtig mache, dann stelle ich das bald um, wenn ich noch am probieren bin, was ich überhaupt genau will. Im Skript wird das schon korrigiert, außer ich übersehe es dann.
-- Αl
-- Beste Gruesse Christoph Stockmayer --------------------------------------------------- Ingenieurbuero Christoph Stockmayer GmbH Dipl.Ing. Chr. Stockmayer SCLT, CNI, LPIC1, CLA Dreihoehenstr. 1 90571 Schwaig Tel: 0911/505241 Fax: 0911/5009584 eMail: sto@stockmayer.de, christoph.stockmayer@gmx.de ePost: christoph.stockmayer@epost.de WWW: www.stockmayer.de, www.stockmayer.eu Geschaeftsfuehrer: Christoph Stockmayer HRB 1290, Bad Hersfeld, Abt. Rotenburg --------------------------------------------------- -- 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
Am 19.04.2012 07:45, schrieb Christoph Stockmayer:
Hi Leute, ich beginn tatsächlich auch gerne mit cat - kann man dann später leichter weitere Kommandos in die Pipe einbauen ...
Am Donnerstag, den 19.04.2012, 01:09 +0200 schrieb Аl Воgnеr:
Am Do, 19 Apr 2012 00:24:16 CEST schrieb Bernd Obermayr:
> cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx > | grep -i type
folgendes ist da aber einfacher und "Pipe" ist immer noch möglich: grep -i type /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | ..... usw. -- Gruß/Kind regards Axel ------------------------------ -- 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
Am Do, 19 Apr 2012 10:06:25 CEST schrieb Axel Birndt:
Am 19.04.2012 07:45, schrieb Christoph Stockmayer:
Hi Leute, ich beginn tatsächlich auch gerne mit cat - kann man dann später leichter weitere Kommandos in die Pipe einbauen ...
Am Donnerstag, den 19.04.2012, 01:09 +0200 schrieb Аl Воgnеr:
Am Do, 19 Apr 2012 00:24:16 CEST schrieb Bernd Obermayr:
> > cat /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx > > | grep -i type
folgendes ist da aber einfacher und "Pipe" ist immer noch möglich:
grep -i type /install/androidins/net_backup_sdkarte/oruxmaps/tracklogs/2012*.gpx | ..... usw.
Na ja, wenn man auf der Konsole rumprobiert um überhaupt mal rauszufinden, wie es gehen könnte, dann nehme ich die Cursor-Taste um zum alten Befehl zu gelangen und dann ist es schon ein Unterschied, ob ich gleich zB type ändern kann oder den Cursor über den ganzen Pfad bewegen muss. Speziell, wenn man viel rumprobiert, ist da ein großer Unterschied. Aber keine Frage, im fertigen Skript ist das suboptimal, obwohl man es zeitlich nicht merken würde. -- Α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
participants (5)
-
Axel Birndt
-
Bernd Obermayr
-
Christoph Stockmayer
-
David Haller
-
Аl Воgnеr