가변 길이

가변 길이

텍스트 파일에서 위도와 경도를 가져오고 있습니다. 이 두 텍스트 파일에는 수천 개의 숫자가 포함되어 있습니다. 나는 그것들을 변수로 읽었고 이제 이 파일에 몇 개의 숫자가 있는지 알고 싶습니다. 나는 이 질문을 사용했습니다:변수 길이 확인그러나 어떤 이유로 내가 얻는 결과는 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[@]}"

관련 정보