BASH는 txt 파일을 읽고 배열에 저장

첫 번째 BASH 스크립트를 작성하고 있습니다. c와 c #에 대한 경험이 있으므로 program is correct..it “s 단지 구문이 너무 복잡합니다. 똑같은 것을 작성하는 데 수십억 가지 방법이 있기 때문입니다!

어쨌든 여기에 스크립트가 있습니다. 단순히 인수 (문자열)가 다음과 같은지 확인합니다. 특정 파일에 포함되어 있습니다. 그렇다면 파일의 각 줄을 배열에 저장하고 배열 항목을 파일에 씁니다. 더 쉬운 방법이있을 것 같지만 bash 루프로 연습을 좀 해보고 싶습니다.

 #!/bin/bash NOME=$1 c=0 #IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY #ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1] if grep "$NOME" /root/phonebook.txt ; then echo "CREATING ARRAY" while read line do myArray[$c]=$line # store line c=$(expr $c + 1) # increase counter by 1 done < /root/phonebook.txt else echo "Name not found" fi c=0 for i in myArray; do if myArray[$i]="$NOME" ; then echo ${myArray[i+1]} >> /root/numbertocall.txt fi done 

이 코드는 두 번째 항목 만 반환합니다. of myArray (myArray[2] 또는 파일의 두 번째 줄) .. why?

댓글

  • \ t의 관련성은 무엇입니까? 텍스트와 나머지 코드는 모두 줄을 참조합니다.
  • 직접 답변이 아니므로 ' 주석을 달았지만 ' 1 a one liner grep; grep -P -o "(?<=$NOME\t).+"
  • @Patrick Classic XY 문제 이므로 귀하의 의견이 답이어야한다고 생각합니다. 결국 옳은 일을합니다.

답변

IFS=$"\n" a=($(cat phonebook.txt)) for i in $(seq ${#a[*]}); do [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}" done 

Bash 4에서 IFS=$"\n" a=($(cat phonebook.txt))

.

grep -A1은 일치 후 한 줄을 인쇄합니다. -x는 -F와 같은 정규식을 비활성화하지만 완전한 l 과만 일치합니다. ines.

grep -x "$name" -A1 phonebook.txt | tail -n1 

댓글

  • 확인할 수 있습니다 먼저 파일의 내용. 귀하에게 달려 있습니다.
  • -x 정규식을 비활성화 하지 않습니다.
  • 는 확장시 split + glob을 호출합니다. 여기서는 split 부분을 원하지만 glob 부분은 원하지 않으므로 비활성화해야합니다 (set -o noglob).
  • grep -xFe "$name" -A1 phonebook.txt 또는 grep -xFA1 -- "$name" phonebook.txt이어야합니다. 그렇지 않으면 '가 작동하지 않습니다. $name-로 시작하거나 $POSIXLY_CORRECT가 환경에있는 경우 올바르게 표시됩니다.
  • bash에서는 ' [[ $string = $pattern ]] 또는 [[ $string = "$otherstring" ]]. 또는 IOW에서는 [[...]] 안에있는 = 연산자의 오른쪽에서 단어 확장을 인용해야합니다. ' 패턴으로 받아들이기를 원하지 않습니다.

답변

index=0 while read line; do myArray[index]="$line" done < inputfile 

최신 버전의 bash는 연관 배열을 지원합니다. 이렇게하면 더 쉬워집니다.

declare -A myArray while read name; do read number myArray[name]="$number" done < inputfile echo ${myArray[name]} 

댓글

  • 그리고 myArray 항목을 반환하는 방법 [name + 1]?
  • 인덱싱 된 예에는 이미 솔루션이 있으므로 복사하지 않았습니다. '
  • 5 월 잘못되었지만 이러한 파이프를 사용하면 myArray가 루프 외부에 " 보이지 않음 "이 (가) 루프 외부에 있습니까 ???
  • @FredericYesidPe ñ aS á nchez 질문이나 답변에 파이프 라인이 포함되어 있지 않으므로 ' 무슨 말을하는지 모르겠습니다.
  • " 이름을 읽는 동안 "는 파이프 라인, 어쨌든, 나는 " declare -a array "가 내가 이전에 겪었던 문제를 해결하는 것을 발견했습니다. 감사합니다 !!! +1

답변

BASH 읽기 txt 파일 및 배열에 저장 readarray에 대해 언급 할 가치가 있다고 생각합니다. 테스트 파일을 배열로 읽는 데 사용하는이 방법의 예는 다음과 같습니다.

readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt 

이번 방법은 줄 바꿈으로 구분 된 IP 주소 파일을 “ arrayIPblacklist “라는 배열. 전화 번호부 파일에서 작동합니다. readarray는 bash 4에서 도입되었으므로이 방법은 이전 bash 버전을 실행하는 이전 호스트에서 작동하지 않습니다.

-t 옵션은 대부분의 경우 포함하지 않기를 원하므로 각 요소에서 줄 바꿈 구분 기호를 제거합니다.

$ seq 3 | bash -c "readarray a; printf "<%q>\n" "${a[@]}"" <$"1\n"> <$"2\n"> <$"3\n"> $ seq 3 | bash -c "readarray -t a; printf "<%q>\n" "${a[@]}"" <1> <2> <3> 

댓글

  • 수락 된 답변은 이미 mapfile를 언급했습니다. 이는 readarray 내장.
  • 내 잘못은 '이를 보지 못했습니다. 감사합니다 @St é phaneChazelas!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다