在文件夹中搜索一堆 GPS 文件以获取最终距离,输出距离列表

在文件夹中搜索一堆 GPS 文件以获取最终距离,输出距离列表

我的文件夹中有一堆 .tcx 文件(本质上是 GPS 设备输出的 XML 文件)。它们遵循命名约定 DATE_LOCATION_SPORT.tcx。每个文件都有一堆跟踪点节点,记录每秒记录的关键 GPS 数据,其中有一个名为“DistanceMeters”的子距离节点。我想 grep 遍历每个文件,找到最后一个“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' 选项能够接受命令管道。

这是解决该问题的一种方法:

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

相关内容