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