itsource

Bash 텍스트 파일에서 배열 생성

mycopycode 2023. 4. 12. 22:20
반응형

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사용하고 싶다면mapfilebash < 4.x에 접속합니다.기존 시스템을 사용합니다.mapfilebash > = 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

반응형