Programing

파일에서 Bash 배열로 줄 읽기

crosscheck 2020. 5. 20. 21:33
반응형

파일에서 Bash 배열로 줄 읽기


이 질문에는 이미 답변이 있습니다.

줄이 포함 된 파일을 Bash 배열로 읽으려고합니다.지금까지 다음을 시도했습니다.

시도 1

a=( $( cat /path/to/filename ) )

시도 2

index=0
while read line ; do
    MYARRAY[$index]="$line"
    index=$(($index+1))
done < /path/to/filename

두 시도 모두 파일의 첫 줄을 포함하는 하나의 요소 배열 만 반환합니다. 내가 무엇을 잘못하고 있지?

bash 4.1.5를 실행 중입니다.


최신 개정의 의견에 따라

BinaryZebra의 의견

여기에 테스트

. 추가

command eval

하면 표현식이 현재 실행 환경에서 유지되고 이전 표현식은 평가 기간 동안 만 유지됩니다.공백 \ 탭이없고 개행 / CR 만있는 $ IFS 사용

$ IFS=$'\r\n' GLOBIGNORE='*' command eval  'XYZ=($(cat /etc/passwd))'
$ echo "${XYZ[5]}"
sync:x:5:0:sync:/sbin:/bin/sync

또한 배열을 잘 설정했지만 잘못 읽었을 수도 있습니다- 위의 예

""

{}

같이 큰 따옴표 와 중괄호 모두 사용하십시오


편집하다:

가능한 glob 확장에 대한 의견, 특히 이전의 해결 시도에 대한

gniourf-gniourf의 의견

에서 내 답변에 대한 많은 경고에 유의하십시오.모든 경고를 염두에두고 나는 여전히이 대답을 여기에 남겨두고 있습니다 (예, bash 4는 몇 년 동안 나왔지만 2/3 세의 일부 Mac은 기본 쉘로 pre-4가 있음을 상기합니다)

기타 참고 사항 :

아래 drizzt의 제안을 따르고 분기 된 subshell + cat을

$(</etc/passwd)

때때로 사용하는 다른 옵션은 IFS를 XIFS로 설정 한 다음 복원합니다. 이것을 귀찮게 할 필요가없는

Sorpigal의 답변

참조하십시오


readarray명령

은 철자

mapfile

4.0에서 도입되었습니다.

readarray a < /path/to/filename

파일의 각 줄을

bash

배열 로 읽는 가장 간단한 방법 은 다음과 같습니다.

IFS=$'\n' read -d '' -r -a lines < /etc/passwd

이제 배열

lines

색인하여 각 줄을 검색하십시오.

printf "line 1: %s\n" "${lines[0]}"
printf "line 5: %s\n" "${lines[4]}"

# all lines
echo "${lines[@]}"

파일에 공백이없는 문자열이 각 줄마다 1 문자열 인 경우 한 가지 방법 :

fileItemString=$(cat  filename |tr "\n" " ")

fileItemArray=($fileItemString)

검사:전체 배열을 인쇄하십시오.

${fileItemArray[*]}

Length=${#fileItemArray[@]}

첫 번째 시도는 끝났습니다. 아이디어를 사용한 간단한 접근 방식은 다음과 같습니다.

file="somefileondisk"
lines=`cat $file`
for line in $lines; do
        echo "$line"
done

#!/bin/bash
IFS=$'\n' read  -d'' -r -a inlines  < testinput
IFS=$'\n' read  -d'' -r -a  outlines < testoutput
counter=0
cat testinput | while read line; 
do
    echo "$((${inlines[$counter]}-${outlines[$counter]}))"
    counter=$(($counter+1))
done
# OR Do like this
counter=0
readarray a < testinput
readarray b < testoutput
cat testinput | while read myline; 
do
    echo value is: $((${a[$counter]}-${b[$counter]}))
    counter=$(($counter+1))
done

참고 URL :

https://stackoverflow.com/questions/11393817/read-lines-from-a-file-into-a-bash-array

반응형