<wpt lat="1.345529841" lon="103.7577152"><time>2010-01-01T00:00:00Z</time</wpt>
<wpt lat="1.345529841" lon="103.7577152"><time>2010-01-01T00:00:00Z</time></wpt>
<wpt lat="1.3982529841" lon="103.90877152"><time>2010-01-01T00:00:00Z</time></wpt>
上記の行を次に変換する必要があるファイルがあります。
1.345529841,103.7577152,2010-01-01 00:00:00
1.345529841,103.7577152,2010-01-01 00:00:00
1.3982529841,103.90877152,2010-01-01 00:00:00
ベストアンサー1
GPXはXML形式です。awk
そのため、安定して使用したりsed
解析することはできません。
代わりに、次のようなものを使用してください。XMLスター(XML文書の形式が正しくエラーがないと仮定):
$ xmlstarlet sel -t -m '//wpt' \
-v '@lat' -o ',' \
-v '@lon' -o ',' \
-v 'time' -nl data.gpx
1.345529841,103.7577152,2010-01-01T00:00:00Z
1.345529841,103.7577152,2010-01-01T00:00:00Z
1.3982529841,103.90877152,2010-01-01T00:00:00Z
または:
xmlstarlet sel -t -m '//wpt' -v 'concat(@lat, ",", @lon, ",", time)' -nl data.wpx
以下を使用することもできますxq
(部分的yq
にhttps://kislyuk.github.io/yq/):
$ xq -r '.. | .wpt? // empty | .[] | map(values) | @csv' data.gpx
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.3982529841","103.90877152","2010-01-01T00:00:00Z"
その後、すべてのノードを見つけ、wpt
すべての属性と子ノードの値を抽出し、それからCSV出力を生成します。
列を並べ替える必要がある場合、または各列に使用する値を選択する必要がある場合でも、これを行うことができます。
$ xq -r '.. | .wpt? // empty | .[] | [."@lat", ."@lon", .time] | @csv' data.gpx
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.345529841","103.7577152","2010-01-01T00:00:00Z"
"1.3982529841","103.90877152","2010-01-01T00:00:00Z"