スクリプトには非常に単純なループが必要です。

スクリプトには非常に単純なループが必要です。

GeodSolve直接測地線の問題を解決するには、Charles Karneyを使用してスクリプトを作成してみてください。 GeodSolveは入力:lat1 lon1 azi1 dist1、出力:lat2 lon2 azi2を受け入れます。

最初の列と2番目の列には、それぞれ方位角と距離を含むファイル(「azi_dist_file」)があります。以下の簡単なスクリプトでは、ユーザーに初期位置 lat1 と lon1 を提供するように要求し、azi1 と dist1 は azi_dist_file から取得します。その後、プログラムはGeodSolve直接測地線の問題を解決し、エンドポイント位置lat2 lon2(およびここでは関係のないazi2)を返します。 2番目の場所を追加呼び出しの初期位置として使用したいが、GeodSolveazi_dist_fileの2行目からazi2を取得します。 dist2;ファイルの最後の行に達するまで繰り返します。最後に、緯度、経度、方位角、距離の値をすべて新しいファイルに書きたいと思います。

これまで私は次のように書いています。

#!/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"

ベストアンサー1

似たようなものが欲しいようです。

#!/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

これは、AT&Tとは異なり、コマンドがサブシェルで実行されることread vars < <(cmd)を説明するためのものです。または、最新バージョンの場合は、この場合と同様の動作を使用できます。bashzshkshcmd | read varsreadbashshopt -s lastpipebashzshksh

POSIXlyでは、次のものも使用できます。

unset -v IFS; set -f; set -- $(cmd); lat=$1 lon=$2

おすすめ記事