Pesquise vários arquivos GPS em uma pasta para obter a distância final e produza uma lista de distâncias

Pesquise vários arquivos GPS em uma pasta para obter a distância final e produza uma lista de distâncias

Eu tenho vários arquivos .tcx (essencialmente um arquivo XML gerado por um dispositivo GPS) em uma pasta. Eles seguem a convenção de nomenclatura DATE_LOCATION_SPORT.tcx. Cada arquivo possui vários nós de pontos de rastreamento que anotam os principais dados de GPS registrados a cada segundo, dentro dos quais há um nó filho de distância até agora chamado "DistanceMeters". Quero percorrer cada arquivo e encontrar o último nó "DistanceMeters" e, em seguida, gerar essa lista de distâncias. Aqui está um trecho de um arquivo. (Estou usando o terminal 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>

Comecei tentando fazer isso com apenas um arquivo (observe que alguns nomes de arquivos têm espaços, não tenho certeza se isso está me atrapalhando);

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

O que obtém muito bem o último nó "DistanceMeters" e, em seguida, usa grep para extrair a distância numérica em vez de toda a linha de xml.

find . -iname '2017*_Running.tcx'

O texto acima me dá uma lista de todos os arquivos nos quais estou interessado neste ano.

Mas quando tento combinar os comandos, tudo desmorona. Ou recebo um erro sobre não terminar em "\;" ou recebo uma resposta, mas apenas o último valor de distância do último arquivo na lista de arquivos, em vez de uma distância para cada um.

Então isso me dá a distância final do último arquivo da lista;

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

Assim como isso;

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

Tentei várias combinações, mas não sei como combiná-las da maneira que preciso. Pensei em talvez colocar o "\;" no final daria certo, mas não funciona - reclama por não terminar em ";" ou "+".

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

rendimentos

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

Alguma ideia?

Obrigado por ler até aqui!

Responder1

O problema aqui é citar... Não sei se existe uma maneira de citar isso corretamente para que a opção 'exec' de find(1) aceite um pipeline de comandos.

Aqui está uma maneira de contornar esse problema:

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

informação relacionada