フォルダ内の複数のGPSファイルから最終距離を検索し、距離リストを出力します。

フォルダ内の複数のGPSファイルから最終距離を検索し、距離リストを出力します。

フォルダには複数の.tcxファイル(デフォルトではGPSデバイスから出力されるXMLファイル)があります。命名規則 DATE_LOCATION_SPORT.tcx に従います。各ファイルには、「DistanceMeters」というサブストリートノードと一緒に毎秒記録される主要なGPSデータを記録する複数のトラックポイントノードがあります。各ファイルを見て、最後の「DistanceMeters」ノードを見つけて、対応する距離のリストを出力したいと思います。これはファイルの一部です。 (私はOS X Sierra端末を使用しています)


<Trackpoint>
 <Time>2017-04-09T08:15:29.000Z</Time>
 <Position>
   <LatitudeDegrees>0.123456</LatitudeDegrees>
   <LongitudeDegrees>-0.654321</LongitudeDegrees>
  </Position>
  <AltitudeMeters>24.363636363636363</AltitudeMeters>
  <DistanceMeters>1382.3235298511217</DistanceMeters>
  <HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
    <Value>130</Value>
  </HeartRateBpm>
</Trackpoint>

私は最初に単一のファイルでこれを試しました(一部のファイル名にはスペースが含まれているので混乱するかもしれません)。

grep '<DistanceMeters>.*<\/DistanceMeters>' '2017-03-23_Somewhere_Running.tcx' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

最後の「DistanceMeters」ノードを取得し、grepを使用してxmlの行全体ではなく数値距離を抽出するのに効果的です。

find . -iname '2017*_Running.tcx'

上記のファイルは、今年私が興味を持っているすべてのファイルです。

しかし、これらのコマンドを組み合わせようとすると、すべてが崩れます。 「\;」で終わらないというエラーが発生するか、回答が得られますが、各ファイルの距離ではなく、ファイルリストの最後のファイルの最後の距離値のみを取得します。

したがって、これはリスト内の最後のファイルの最終距離を提供します。

find . -iname '*_Running.tcx' -print0 | xargs -0 grep '<DistanceMeters>.*<\/DistanceMeters>' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

そうです。

find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} \; | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

さまざまな組み合わせを試しましたが、必要な方法で組み合わせる方法がわかりません。最後に「\;」を追加すればいいと思いましたが、うまくいきません。 ";"または「+」で終わらないと文句を言います。

find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} | tail -1 | grep -o '[0-9]\+\.[0-9]\+' \;

生産する

grep: ;: No such file or directory
find: -exec: no terminating ";" or "+"

どんなアイデアがありますか?

この記事を読んでくれてありがとう!

ベストアンサー1

ここでの問題は引用です... find(1)の 'exec'オプションがコマンドパイプを受け入れるように正しく引用する方法があるかどうかわかりません。

問題を解決する1つの方法は次のとおりです。

$ for rfile in $(find . -iname '2017*_Running.tcx'); do grep '<DistanceMeters>.*<\/DistanceMeters>' $rfile | tail -1 | grep -o '[0-9]\+\.[0-9]\+'; done

おすすめ記事