Precisa de um loop muito simples para um script

1

Tentando escrever um script simples que use GeodSolve de Charles Karney para resolver um problema geodésico direto. O GeodSolve usa a entrada: lat1 lon1 azi1 dist1 e as saídas: lat2 lon2 azi2.

Eu tenho um arquivo ("azi_dist_file") contendo azimutes e distâncias na primeira e segunda coluna, respectivamente. No script abaixo, o usuário é solicitado a fornecer a posição inicial, lat1 e lon1, enquanto azi1 e dist1 são buscados a partir de azi_dist_file. O programa GeodSolve resolverá o problema geodésico direto e retornará a posição final, lat2 lon2 (e azi2 que é irrelevante aqui); Eu gostaria que esta segunda posição fosse usada como a posição inicial em uma outra invocação de GeodSolve , mas buscando azi2 e dist2 da segunda linha de azi_dist_file; repetido até que a última linha desse arquivo seja atingida. Finalmente, gostaria que todos os valores lat, lon, azi, dist escritos em um novo arquivo.

Até agora eu consegui escrever o seguinte, mas não tenho a menor idéia de onde ir a partir daqui. Qualquer ajuda seria muito apreciada.

#!/bin/bash
echo "Enter starting latitude: "
read lat1
echo "Enter starting longitude: "
read lon1
alpha1='awk 'NR==1{print;exit}' azi_dist_file|cut -f1 -d$'\t''
dist1='awk 'NR==1{print;exit}' azi_dist_file|cut -f2 -d$'\t''
echo "$lat1 $lon1 $alpha1 $dist1" >> lat_lon_azi_dist_file
echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve
lat2='echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f1 -d' ''
lon2='echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f2 -d' ''
echo "$lat2 $lon2"
    
por weirp 13.09.2016 / 17:39

1 resposta

0

Parece que você quer algo como:

#!/bin/bash -
# lat/lon passed as arguments to the script instead of being input to the
# user:
lat=${1?} lon=${2?}

while read alpha dist ignore; do
  printf '%s\n' "$lat $lon $alpha $dist" >&3
  read lat lon ignore < <(
    printf '%s\n' "$lat $lon $alpha $dist" | GeodSolve 3>&-)
  printf '%s\n' "$lat $lon"
done < azi_dist_file 3> lat_lon_azi_dist_file

O read vars < <(cmd) é para contornar o fato de que, em bash (ao contrário de zsh ou AT & T ksh ) em cmd | read vars , o comando read é executado em um subshell. Como alternativa, com versões recentes de bash , você pode usar shopt -s lastpipe para que bash se comporte como zsh ou ksh neste caso.

POSIXly, você também pode usar:

unset -v IFS; set -f; set -- $(cmd); lat=$1 lon=$2
    
por 13.09.2016 / 17:59