Mailinglist Archive: opensuse-de (372 mails)
| < Previous | Next > |
Re: Bash-Skript: Löschen mit sed, Summenbildung
- From: David Haller <dnh@xxxxxxxxxxxx>
- Date: Fri, 20 Apr 2012 14:11:16 +0200
- Message-id: <20120420121116.GA12961@grusum.endjinn.de>
Hallo,
Am Thu, 19 Apr 2012, ?l ??gn?r schrieb:
Anscheinend immer danach.
[..]
==== [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@xxxxxxxxxxxx
Um den Listen Administrator zu erreichen, schicken
Sie eine Mail an: opensuse-de+owner@xxxxxxxxxxxx
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@xxxxxxxxxxxx
Um den Listen Administrator zu erreichen, schicken
Sie eine Mail an: opensuse-de+owner@xxxxxxxxxxxx
| < Previous | Next > |