ProgramingTip

Bash의 텍스트 파일에서 배열 만들기

bestdevel 2020. 11. 8. 10:36
반응형

Bash의 텍스트 파일에서 배열 만들기


펼쳐지는 URL을 가져 오기 필수 필드에 구문 분석하고 출력을 리디렉션하여 file.txt 파일에 저장합니다 . 출력은 필드가 발견 될 때마다 새 줄에 저장됩니다.

file.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... 

각 줄의 전체 노드가 배열의 각 변수와 일대일 일치하는 아래의 루프를 어떻게 배열합니까?


다음 명령을 사용하십시오 .mapfile

mapfile -t myArray < file.txt

오류는 다음을 사용 하고 있습니다. 파일 for 을 반복하는 관용적 인 방법 은 다음과 같습니다.

while IFS= read -r line; do echo ">>$line<<"; done < file.txt

자세한 내용은 BashFAQ / 005 를 참조하십시오.


mapfilereadarray(동의어있는) 배쉬 버전 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`.

노트 :

파일 이름 확장이 계속 발생합니다. 예를 들어, 리터럴 있는 줄이 있으면 현재 폴더의 모든 파일로 확장됩니다. 따라서 파일에 시나리오가없는 경우에만 사용하십시오.*


파일에서 각 줄을 배열에 할당하기 만하면됩니다.

#!/bin/bash
i=0
while read line 
do
        arr[$i]="$line"
        i=$((i+1))
done < file.txt

맵 파일을 사용하거나 -a를 읽으십시오.

항상 shellcheck를 사용하여 코드를 확인하십시오 . 종종 정답을 줄 것입니다. 이 경우 SC2207 은 공백으로 구분되거나 줄 바꿈으로 구분 된 값이있는 파일을 배열로 읽는 것을 다룹니다.

이러지마

array=( $(mycommand) )

줄 바꿈으로 구분 된 값이있는 파일

mapfile -t array < <(mycommand)

공백으로 구분 된 값이있는 파일

IFS=" " read -r -a array <<< "$(mycommand)"

shellcheck 페이지는 이것이 모범 사례로 간주되는 이유를 제공합니다.


이 대답

mapfile -t myArray < file.txt

어떤 이유로 든 bash <4.x 에서 사용하려면 shim만들었습니다 . bash> = 4.x 인 경우 기존 명령을 사용합니다.mapfilemapfilemapfile

현재는 옵션 -d-t작업 만 있습니다 . 그러나 위의 명령에는 충분합니다. macOS에서만 테스트했습니다. macOS Sierra 10.12.6에서 시스템 bash는 3.2.57(1)-release. 따라서 심이 유용 할 수 있습니다. homebrew로 bash를 업데이트하고 직접 bash를 빌드 할 수도 있습니다.

이 기술사용 하여 하나의 호출 스택에 변수를 설정합니다.

참고 URL : https://stackoverflow.com/questions/30988586/creating-an-array-from-a-text-file-in-bash

반응형