可変長

可変長

テキストファイルから緯度と経度を取得しています。これら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[@]}"

おすすめ記事