구분 기호를 사용하여 줄을 나누고 두 필드를 다른 변수에 저장합니다.

구분 기호를 사용하여 줄을 나누고 두 필드를 다른 변수에 저장합니다.

여러 행이 있는 텍스트 파일이 있습니다. 파일을 줄 단위로 읽으려면 while 명령을 사용하고 있지만 값을 별도의 변수에 저장하고 후행 쉘 스크립트에서 사용해야 합니다.

그만큼자르다명령은 읽기 행이 아닌 전체 파일을 구분합니다.

my_file.txt:

d1:jobid1
id2:jobid2

아래 while 루프를 사용하여 파일을 줄 단위로 읽습니다.

while IFS= read -r line; do
    jobid=`cut -d: -f2`
    id=`cut -d: -f1`

#remaining shell-script dependent upon variables#

done < my_file.txt

my_file.txt모든 줄의 작업 ID와 ID를 저장 하고 후행 스크립트를 실행하고 싶습니다 .각 줄은 새로운 줄에 있습니다

변수에 값을 재귀적으로 저장하는 데 도움이 필요합니다. 줄 단위로 읽고 두 필드를 별도로 구분하여 저장하는 더 좋은 방법이 있는 경우.

답변1

cut기본적으로 표준 입력에서 읽습니다. 명령 대체에서 표준 입력은 루프의 표준 입력에서 상속됩니다( 호출에 대해 다른 명시적 입력을 제공하지 않기 때문 cut). 루프의 표준 입력은 입력 파일에서 나옵니다.

결과적으로 파일의 첫 번째 줄은 에 의해 읽혀지고 read다른 모든 줄은 에 대한 첫 번째 호출에 의해 읽혀집니다 cut. 따라서 변수 의 값은 jobid줄 바꿈으로 구분된 작업 ID 문자열이 되지만 변수 id는 비어 있습니다. 루프는 단일 반복만 실행합니다.

사용할 수있다, 예를 들어,

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")

하지만 그렇게 하는 것이 더 깨끗하고 훨씬 더 효율적이므로 불필요할 것입니다.

while IFS=: read -r id jobid; do
    # code that uses "$id" and "$jobid" goes here
done <my_file.txt

read이는 입력 라인의 데이터를 여러 변수로 동시에 읽을 수 있다는 사실을 사용합니다 . 콜론으로 설정하면 IFS행이 콜론으로 분할되어 첫 번째 필드를 읽고 id나머지 필드를 로 읽습니다 jobid. 전화할 필요가 cut전혀 없습니다 .

관련 정보