development

탭으로 구분 된 파일 행을 배열로 읽습니다.

big-blog 2020. 12. 7. 20:12
반응형

탭으로 구분 된 파일 행을 배열로 읽습니다.


파일을 한 줄씩 스크립트로 읽고 싶습니다. 파일의 각 줄은 탭으로 구분 된 여러 값입니다. 각 줄을 배열로 읽고 싶습니다.

일반적인 bash "한 줄씩 파일 읽기"예제;

while read line
do
echo $line;
done < "myfile"

하지만 저에게 myfile은 다음과 같습니다 (탭으로 구분 된 값).

value1 value2 value3
value4 value5 value6

루프를 반복 할 때마다 각 줄이 배열로 들어가서

while read line into myArray
do
 echo myArray[0]
 echo myArray[1]
 echo myArray[2]
done < "myfile"

이것은 첫 번째 루프 반복에서 다음을 인쇄합니다.

value1
value2
value3

그런 다음 두 번째 반복에서 인쇄됩니다.

value4
value5
value6

이것이 가능한가? 내가 볼 수있는 유일한 방법은 값을 수동으로 나누는 작은 함수를 작성하는 것입니다.이를 위해 bash에 내장 된 지원이 있습니까?


당신은 매우 가깝습니다.

while IFS=$'\t' read -r -a myArray
do
 echo "${myArray[0]}"
 echo "${myArray[1]}"
 echo "${myArray[2]}"
done < myfile

(는 -r말한다 read\(가), 입력 데이터에 특별한되지 -a myArray단어로 입력 라인을 분할에 결과를 저장하기를 알려줍니다 myArray, 그리고는 IFS=$'\t'대신도의 일반 배쉬 기본으로, 분할 단어 만 탭을 사용하도록 지시 공백으로 단어를 분할 할 수도 있습니다.이 접근 방식은 하나 이상의 탭을 구분 기호로 취급 하므로 필드가 비어 있으면 이후 필드가 배열의 이전 위치로 "이동"됩니다. 괜찮습니까?)


모든 단어 (bash 의미)를 모든 while 루프 반복에서 배열을 완전히 변경하는 다른 배열 인덱스로 분할하려는 경우 @ruakh의 대답이 올바른 접근 방식입니다. 하지만 당신은 다른 변수에 읽을 때마다 단어를 분할 읽기 속성을 사용할 수 있습니다 column1, column2, column3이 코드에서처럼

while IFS=$'\t' read -r column1 column2 column3 ; do
  printf "%b\n" "column1<${column1}>"
  printf "%b\n" "column2<${column2}>"
  printf "%b\n" "column3<${column3}>"
done < "myfile"

의미있는 변수 이름을 사용하여 배열 인덱스 액세스를 피하고 코드 가독성을 향상시키는 유사한 결과를 얻으려면 (물론을 사용 columnN하는 것은 좋은 생각이 아닙니다).


시도해 볼 수도 있습니다.

OIFS=$IFS;
IFS="\t";

animals=`cat animals.txt`
animalArray=$animals;

for animal in $animalArray
do
    echo $animal
done

IFS=$OIFS;

참고 URL : https://stackoverflow.com/questions/9736202/read-tab-separated-file-line-into-array

반응형