텍스트 파일을 읽고 정보를 변수에 저장

텍스트 파일을 읽고 정보를 변수에 저장

다음 형식의 레코드가 포함된 텍스트 파일이 있습니다.

SCI.txt

12-12-1990
12-12-1991
CSE Department

또는

12-12-1990,12-12-1991,CSE Department

3개의 변수에 저장하고 싶습니다.

a,b,c

txt 파일을 읽고 쉘 스크립트(ksh)를 사용하여 값을 변수에 저장하려고 합니다.

- - 갱신 - -

인터넷에 있는 거의 모든 방법을 시도해 봤습니다. 나는 그들을 작동시킬 수 없습니다.

이제 나는 이 방법을 시도하고 있다.

#!/usr/bin/ksh
#reading the file content and storing in variable
_input="sci.txt"
while IFS='|' read -r fdate rdate dcname
do
   echo "$fdate $rdate $dcname"
done < "$_input"

sci.txt의 내용은 다음과 같습니다

demo1|demo2|demo3

하지만 위의 방법으로는 어떤 결과도 얻지 못합니다.

답변1

sci.txt개행 문자로 끝나는 것 같지 않습니다. 에서 언급한 대로 man ksh내장 read함수는 기본적으로 첫 번째 개행 문자를 읽습니다.

  read [ -ACSprsv ] [ -d delim] [ -n n] [ [ -N n] [ [ -t  timeout]  [  -u
   unit] [ vname?prompt ] [ vname ... ]
          The  shell  input  mechanism.  One line is read and is broken up
          into fields using the characters  in  IFS  as  separators.   The
          escape  character,  \, is used to remove any special meaning for
          the next character and for line  continuation.   The  -d  option
          causes  the  read  to  continue  to the first character of delim
          rather than new-line.

따라서 를 사용하지 않으면 개행 문자를 찾습니다 -d. 파일에 파일이 없으면 실제로 아무것도 읽지 않습니다. 표시하려면:

$ printf 'demo1|demo2|demo3\n' > sci.newline
$ printf 'demo1|demo2|demo3' > sci.nonewline

$ cat foo.sh
#!/usr/bin/ksh
for file in sci.newline sci.nonewline; do
    echo "Running on: $file"
    while IFS='|' read -r fdate rdate dcname
    do
        echo "$fdate $rdate $dcname"
    done < "$file"
done

이 스크립트를 실행하면 예상되는 출력이 반환되지만 sci.newline다음은 반환되지 않습니다 sci.nonewline.

$ foo.sh < sci.nonewline 
Running on: sci.newline
demo1 demo2 demo3
Running on: sci.nonewline

따라서 파일이 \n줄 바꿈( )으로 끝나면 모든 것이 예상대로 작동해야 합니다.


이제 귀하의 명령문이 루프 외부에서 작동하는 이유 echo는 루프가 실행되지 않기 때문입니다. 문자가 발견되지 않으면 0이 아닌(실패) 종료 상태를 반환합니다 read. 성공할 때마다 구성이 실행됩니다. 실패 로 인해 루프가 실행되지 않으며 루프 내부도 실행되지 않습니다. 대신 스크립트는 명령을 실행하고 변수를 할당한 후 실패가 반환되므로 다음 섹션으로 계속 진행됩니다. 이것이 바로 다음 항목(루프 외부 항목)이 예상대로 작동하는 이유입니다.\nwhile SOMETHING; doSOMETHINGreadechoreadreadecho

답변2

while IFS=" ," read a b c; do
    echo a: $a b: $b c: $c
done < SCI.txt

관련 정보