我的文件夹中有一堆 .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