テキストファイルから緯度と経度を取得しています。これら2つのテキストファイルには数千の数字が含まれています。私はそれらを変数として読んで、今このファイルにいくつの数があるかどうかを知りたいです。私はこの質問を使いました:変数の長さの確認しかし、何らかの理由で私が得た結果はlength of Lat is 1
。
#!/bin/sh
mapfile Latitude < final_ADCP_Saved.matLatitude.txt
mapfile Longitude < final_ADCP_Saved.matLongitude.txt
echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"
echo "$Longitude
出力だと言ったら
3.4269394e+00 3.4240913e+00 3.4212670e+00 3.4184430e+00 3.4156012e+00 3.4126834e+00 3.4097271e+00 3.4069235e+00 3.4041572e+00 3.4010903e+00 3.3982218e+00 3.3953517e+00 3.3925018e+00 3.3897342e+00 3.3868243e+00 3.3839234e+00 3.3810560e+00
この変数の長さを決定する方法は?
ベストアンサー1
値の間に改行文字はありません。したがって、次のように区切り文字を指定する必要があります-d
。
mapfile -d ' ' Latitude < final_ADCP_Saved.matLatitude.txt
mapfile -d ' ' Longitude < final_ADCP_Saved.matLongitude.txt
これで、各緯度/経度が独自の配列要素に正しく配置されます。
編集:この-d
オプションは現代的な攻撃のようです。この問題を解決する別の方法は、tr
空白を改行に変換するようです(これを使用して-s
重複を削除します)。
tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt | mapfile Latitude
残念ながら、パイプはサブシェルmapfile
で実行されるため、この変数はデフォルトのシェルでは使用できないため機能しません。
回避策は、最初にシェルの標準入力を代替プロセスに変更し、次を実行することですmapfile
。
#!/bin/bash
exec < <(tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt)
mapfile Latitude
exec < <(tr -s ' ' '\n' < final_ADCP_Saved.matLongitude.txt)
mapfile Longitude
echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"
#!/bin/bash
これはbashでのみ機能するため、最初の行を次に変更しました。
編集2
今考えてみると、このexec
部分は別にする必要はないようです。
#!/bin/bash
mapfile Latitude < <(tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt)
mapfile Longitude < <(tr -s ' ' '\n' < final_ADCP_Saved.matLongitude.txt)
echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"