Bash 텍스트 파일에서 배열 생성
스크립트는 URL을 가져와 필수 필드에 대해 구문 분석하고 출력을 파일, 파일에 저장하도록 리디렉션합니다.txt. 필드를 찾을 때마다 출력이 새 줄에 저장됩니다.
파일.txt
A Cat
A Dog
A Mouse
etc...
가져가고 싶다file.txt
여기서부터 배열을 새로운 스크립트로 작성합니다.이 스크립트에서 각 행은 배열 내의 자체 문자열 변수가 됩니다.지금까지의 시도:
#!/bin/bash
filename=file.txt
declare -a myArray
myArray=(`cat "$filename"`)
for (( i = 0 ; i < 9 ; i++))
do
echo "Element [$i]: ${myArray[$i]}"
done
이 스크립트를 실행하면 공백으로 인해 워드가 분할되어 다음 메시지가 표시되지 않습니다.
바람직한 출력
Element [0]: A Cat
Element [1]: A Dog
etc...
결국 이렇게 되는 거야.
실제 출력
Element [0]: A
Element [1]: Cat
Element [2]: A
Element [3]: Dog
etc...
각 행의 문자열 전체가 어레이 내의 각 변수와 1 대 1로 대응하도록 하기 위해 아래의 루프를 조정하려면 어떻게 해야 합니까?
다음 명령을 사용합니다.
mapfile -t myArray < file.txt
에러가 사용되고 있다.for
-- 파일의 행에 루프 하는 관용적인 방법은 다음과 같습니다.
while IFS= read -r line; do echo ">>$line<<"; done < file.txt
"Bash" 참조자세한 내용은 FAQ/005를 참조하십시오.
mapfile
그리고.readarray
(동음이의)는 Bash 버전4 이후부터 사용할 수 있습니다.이전 버전의 Bash가 있는 경우 루프를 사용하여 파일을 어레이로 읽을 수 있습니다.
arr=()
while IFS= read -r line; do
arr+=("$line")
done < file
파일에 불완전한(누락된 새 행) 마지막 행이 있는 경우 다음 대안을 사용할 수 있습니다.
arr=()
while IFS= read -r line || [[ "$line" ]]; do
arr+=("$line")
done < file
관련:
이것도 할 수 있어요.
oldIFS="$IFS"
IFS=$'\n' arr=($(<file))
IFS="$oldIFS"
echo "${arr[1]}" # It will print `A Dog`.
주의:
파일명의 확장이 아직 행해진다.예를 들어 리터럴이 있는 라인이 있으면*
현재 폴더의 모든 파일로 확장됩니다.따라서 파일에 이러한 시나리오가 없는 경우에만 사용하십시오.
맵 파일을 사용하거나 -a를 읽습니다.
항상 셸체크를 사용하여 코드를 확인하십시오.그것은 종종 당신에게 정답을 줄 것이다.이 경우 SC2207에서는 공백으로 구분된 값 또는 줄바꿈으로 구분된 값을 배열로 포함하는 파일 읽기에 대해 설명합니다.
이러지마세요
array=( $(mycommand) )
값이 줄 바꿈으로 구분된 파일
mapfile -t array < <(mycommand)
공백으로 구분된 값이 있는 파일
IFS=" " read -r -a array <<< "$(mycommand)"
셸 체크 페이지에서는 이것이 베스트 프랙티스로 간주되는 이유를 설명합니다.
파일에서 각 행을 읽고 배열에 할당할 수 있습니다.
#!/bin/bash
i=0
while read line
do
arr[$i]="$line"
i=$((i+1))
done < file.txt
이 답변은 사용하라고 합니다.
mapfile -t myArray < file.txt
제가 심을 만들었어요mapfile
사용하고 싶다면mapfile
bash < 4.x에 접속합니다.기존 시스템을 사용합니다.mapfile
bash > = 4.x에 있는 경우 명령어
현시점에서는-d
그리고.-t
하지만 위의 명령어로는 충분할 겁니다macOS에서만 테스트했습니다.MacOS Sierra 10.12.6에서는 시스템 bash는3.2.57(1)-release
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★또한 홈브루로 bash를 업데이트하거나 bash를 직접 빌드할 수도 있습니다.
이 기술을 사용하여 변수를 1개의 콜스택으로 설정합니다.
각 단어가 새 배열 엔트리에 들어가지 않도록 내부 파일 구분자(IFS) 변수를 $'\n'로 설정하십시오.
#!/bin/bash
# move all 2020 - 2022 movies to /backup/movies
# put list into file 1 line per dir
# dirs are "movie name (year)/"
ls | egrep 202[0-2] > 2020_movies.txt
OLDIFS=${IFS}
IFS=$'\n' #fix separator
declare -a MOVIES # array for dir names
MOVIES=( $( cat "${1}" ) ) // load into array
for M in ${MOVIES[@]} ; do
echo "[${M}]"
if [ -d "${M}" ] ; then # if dir name
mv -v "$M" /backup/movies/
fi
done
IFS=${OLDIFS} # restore standard separators
# not essential as IFS reverts when script ends
#END
언급URL : https://stackoverflow.com/questions/30988586/creating-an-array-from-a-text-file-in-bash
'itsource' 카테고리의 다른 글
MonoTouch와 Objective-C 중 하나를 결정하는 방법 (0) | 2023.04.12 |
---|---|
Git에서 현재의 지점명을 취득하려면 어떻게 해야 하나요? (0) | 2023.04.12 |
TSQL datetime 필드에서 YYY-MM-DD 형식의 날짜를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.07 |
INSERT 문이 외부 키 제약 조건과 충돌합니다(SQL Server). (0) | 2023.04.07 |
SQL-Server에서 테이블 변수를 드롭하려면 어떻게 해야 합니까?이래도 되나? (0) | 2023.04.07 |