Reinhard Zwirner <
reinhard...@t-online.de>:
>für meinen Win10/64pro-PC suche ich ein Programm, das das im
>Folgenden geschilderte Problem lösen kann:
>
>Wenn ich wandere, habe ich als Spielzeug ein Outdoor-GPS von Garmin
>dabei. Es ist so eingestellt, daß jede Sekunde die aktuelle Position
>in folgendem Format in einer .gpx-Datei im Ordner "Current"
>abgespeichert wird:
>
><trkpt lat="xx.xxxxxxxxx" lon="yyy.yyyyyyyyy">
> <time>YYYY-MM-DDThh:mm:ssZ</time>
></trkpt>
>
Also ist jeder Messpunkt ein Dreizeiler.
Wenn man jeden Messpunkt zum Einzeiler macht (also den Zeilenwechsel
am Ende der ersten und der zweiten Zeile entfernt), erhält man eine
5spaltige Liste von Messpunkten. Wenn man die nach der vierten
Spalte sortiert, kann man anschließend aufeinanderfolgende
Dubletten entfernen.
>Hinzufügen möchte ich, daß die Speicherung als String ohne jegliche
>Strukturierung erfolgt.
>
>Wenn die Wanderung länger dauert und ca. 3000 Trackpunkte gespeichert
>wurden, werden die in einer Datei zusammengefaßt, die in den Ordner
>"Archive" verschoben wird. Diese Häppchen-Dateien sind ca. 300 kB
>groß. Gleichzeitig beginnt eine neue "Trackpunktsammlung" im Ordner
>"Current".
>
>Nun ist beim letzten Mal irgendwann irgendwo irgendwie ein Malheur
>passiert. Jedenfalls war eine der Dateien aus dem "Archive"-Ordner
>sagenhafte 600 MB groß! Eine Analyse ergab, daß "Dateiheader" samt
>"Dateiformat" in Ordnung und alle Trackpunke gespeichert sind, aber
>jeder Trackpunkt mehrere 1000 Mal!
>
>Ich suche jetzt ein Programm, das diese Datei durchflöht und außer
>dem für jede Sekunde gespeicherten ersten Trackpunkt alle anderen für
>diese Sekunde gespeicherten Trackpunktdaten löscht. Gibt's sowas? Ich
>könnte die vorhandene Datei so vorbereiten, daß sie nur die im o. g.
>Format gespeicherten Trackpunkte enthält und sonst nichts.
Ja, bitte. Das wäre gut.
Die Zeilenwechsel entfernen kann man sicher mit «sed», «awk» oder
auch nur dem Shell:
Nur mit dem Shell:
while IFS= read erste_zeile &&
IFS= read zweite_zeile &&
IFS= read dritte_zeile
do
printf '%s\n' "$erste_zeile $zweite_zeile $dritte_zeile"
done < 600MB_Datei.gpx
Schneller läuft es wahrscheinlich mit Hilfe von «sed»:
(
sp1='<trkpt' &&
sp2='lat="[+-]?[[:digit:]]{2}\.[[:digit:]]+"' &&
sp3='lon="[+-]?[[:digit:]]{3}\.[[:digit:]]+">' &&
sed -E -e \
/"$sp1 $sp2 $sp3"'/ {
N; N
s/\n//g
}' -- 600MB_Datei.gpx
)
Sortieren nach der vierten Spalte:
sort -k 4,4
Messzeitpunkt‐Dubletten entfernen:
uniq -f 3
Alles zusammengenommen:
(
sp1='<trkpt' &&
sp2='lat="[+-]?[[:digit:]]{2}\.[[:digit:]]+"' &&
sp3='lon="[+-]?[[:digit:]]{3}\.[[:digit:]]+">' &&
sed -E -e \
/"$sp1 $sp2 $sp3"'/ {
N; N
s/\n//g
}' -- 600MB_Datei.gpx
) |
sort -k 4,4 |
uniq -f 3 > eingedampfte_Datei.gpx
Als Shell‐Skript «eindampfen»:
#!/bin/sh
(
sp1='<trkpt' &&
sp2='lat="[+-]?[[:digit:]]{2}\.[[:digit:]]+"' &&
sp3='lon="[+-]?[[:digit:]]{3}\.[[:digit:]]+">' &&
sed -E -e \
/"$sp1 $sp2 $sp3"'/ {
N; N
s/\n//g
}'
) |
sort -k 4,4 |
uniq -f 3
Aufrufen mit
eindampfen < 600MB_Datei.gpx > eingedampfte_Datei.gpx
Die eingedampfte Datei enthält die Messpunkte jetzt noch als
Einzeiler. Stört das? Dann müsste man die Zeilen noch
wiederumbrechen. Das lässt sich sicher auch mit «sed», «awk» oder
dem Shell bewerkstelligen. (Ich mach' mir aber nur dann die Mühe,
mir das zu überlegen, wenn es nötig ist.)