programing

변수에 값을 할당하여 한 줄씩 파일 읽기

nasanasas 2020. 9. 30. 10:55
반응형

변수에 값을 할당하여 한 줄씩 파일 읽기


다음 .txt 파일이 있습니다.

Marco
Paolo
Antonio

한 줄씩 읽고 싶고 각 줄에 대해 .txt 줄 값을 변수에 할당하고 싶습니다. 내 변수가라고 가정하면 $name흐름은 다음과 같습니다.

  • 파일에서 첫 줄 읽기
  • 할당 $name= "Marco"
  • 일부 작업 수행 $name
  • 파일에서 두 번째 줄 읽기
  • 할당 $name= "Paolo"

다음은 한 줄씩 인수로 전달 된 파일을 읽습니다.

#!/bin/bash
while IFS= read -r line; do
    echo "Text read from file: $line"
done < "$1"

이것은 루프의 파일에서 행을 읽기위한 표준 형식 입니다. 설명:

  • IFS=(또는 IFS='') 선행 / 후행 공백이 잘리는 것을 방지합니다.
  • -r 백 슬래시 이스케이프가 해석되지 않도록합니다.

위의 내용이 filename으로 스크립트에 저장 readfile되면 다음과 같이 실행할 수 있습니다.

chmod +x readfile
./readfile filename.txt

파일이 표준 POSIX 텍스트 파일이 아닌 경우 (= 개행 문자로 끝나지 않음) 루프를 수정하여 후행 부분 행을 처리 할 수 ​​있습니다.

while IFS= read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"

여기서는 || [[ -n $line ]]마지막 줄이 a로 끝나지 않는 경우 무시되는 것을 방지합니다 \n( readEOF를 만나면 0이 아닌 종료 코드를 반환하기 때문에 ).

루프 내부의 명령이 표준 입력에서도 읽는 경우에서 사용하는 파일 설명자가 read다른 항목 ( 표준 파일 설명자 피함)이 될 수 있습니다 . 예 :

while IFS= read -r -u3 line; do
    echo "Text read from file: $line"
done 3< "$1"

(비 배쉬 쉘은 모를 수도 read -u3, 사용 read <&3대신에.)


다음을 나타내는 -r플래그 를 사용하는 것이 좋습니다 read.

-r  Do not treat a backslash character in any special way. Consider each
    backslash to be part of the input line.

에서 인용하고 man 1 read있습니다.

또 다른 것은 파일 이름을 인수로 취하는 것입니다.

다음은 업데이트 된 코드입니다.

#!/usr/bin/bash
filename="$1"
while read -r line; do
    name="$line"
    echo "Name read from file - $name"
done < "$filename"

Using the following Bash template should allow you to read one value at a time from a file and process it.

while read name; do
    # Do what you want to $name
done < filename

#! /bin/bash
cat filename | while read LINE; do
    echo $LINE
done

Many people have posted a solution that's over-optimized. I don't think it is incorrect, but I humbly think that a less optimized solution will be desirable to permit everyone to easily understand how is this working. Here is my proposal:

#!/bin/bash
#
# This program reads lines from a file.
#

end_of_file=0
while [[ $end_of_file == 0 ]]; do
  read -r line
  # the last exit status is the 
  # flag of the end of file
  end_of_file=$?
  echo $line
done < "$1"

Use:

filename=$1
IFS=$'\n'
for next in `cat $filename`; do
    echo "$next read from $filename" 
done
exit 0

If you have set IFS differently you will get odd results.


If you need to process both the input file and user input (or anything else from stdin), then use the following solution:

#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
    read -p "> $line (Press Enter to continue)"
done

Based on the accepted answer and on the bash-hackers redirection tutorial.

Here, we open the file descriptor 3 for the file passed as the script argument and tell read to use this descriptor as input (-u 3). Thus, we leave the default input descriptor (0) attached to a terminal or another input source, able to read user input.


For proper error handling:

#!/bin/bash

set -Ee    
trap "echo error" EXIT    
test -e ${FILENAME} || exit
while read -r line
do
    echo ${line}
done < ${FILENAME}

Use IFS (internal field separator) tool in bash, defines the character using to separate lines into tokens, by default includes <tab> /<space> /<newLine>

step 1: Load the file data and insert into list:

# declaring array list and index iterator
declare -a array=()
i=0

# reading file in row mode, insert each line into array
while IFS= read -r line; do
    array[i]=$line
    let "i++"
    # reading from file path
done < "<yourFullFilePath>"

step 2: now iterate and print the output:

for line in "${array[@]}"
  do
    echo "$line"
  done

echo specific index in array: Accessing to a variable in array:

echo "${array[0]}"

The following will just print out the content of the file:

cat $Path/FileName.txt

while read line;
do
echo $line     
done

참고URL : https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable

반응형