source

파일에서 Bash 배열로 줄 읽기

nicesource 2023. 4. 19. 23:12
반응형

파일에서 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를 실행하고 있습니다.

명령어(철자)mapfile)는 bash 4.0에서 도입되었습니다.

readarray -t a < /path/to/filename

Binary Zebra의 코멘트근거해, 여기서 테스트한 최신의 리비전.의 추가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

또, 어레이는 올바르게 설정되어 있습니다만, 판독이 잘못되어 있는 경우도 있습니다.양쪽의 큰따옴표를 사용해 주세요.""및 브레이스{}위의 예와 같이


편집:

글로벌 확장 가능성에 대한 코멘트, 특히 gniourf-gniourf의 코멘트에서 내 답변에 대한 많은 경고에 유의하십시오.

이러한 모든 경고를 염두에 두고 이 답변을 여기에 남깁니다(예, bash 4는 몇 년 전에 출시되었지만 일부 Mac은 4보다 이전 버전이 기본 셸로 설정되어 있습니다).

기타 주의사항:

또한 아래 Drizzt의 제안에 따라 포크 서브셸+cat을 다음으로 대체할 수 있습니다.

$(</etc/passwd)

다른 옵션은 IFS를 XIFS로 설정한 후 복원하는 것입니다.번거롭지 않은 Sorpigal의 답변도 참조하십시오.

파일의 각 행을 읽어들이는 가장 간단한 방법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

반응형