나중에 파일의 값을 변경하세요.

나중에 파일의 값을 변경하세요.

이름, 생년월일, 선물이 포함된 데이터베이스와 같은 파일이 있는데 이 사람이 우리로부터 선물을 받았는지 알고 싶습니다. 날짜는 파일에서 한 줄에 하나씩 탭으로 구분됩니다. 예를 들면 다음과 같습니다.

name1  surname1  dateofbirth1  gift1
name2  surname2  dateofbirth2  gift2

선물 열에 "예" 또는 "아니요"를 저장하면 내 코드는 다음과 같습니다.

while IFS=$'\t' read -r name surname dob gift; do
    if [[ "$gift" == "No" ]]; then
        echo "Congrats, here is your gift
        gift=Yes
    fi
done < "file.txt"

그런데 선물란은 변함이 없고, 보조변수로만 존재하는 것 같습니다. 해당 열의 해당 행 값을 yes로 어떻게 변경합니까?

답변1

파일에서 값을 읽은 다음 해당 값을 보유하는 변수를 변경해도 파일의 값은 변경되지 않습니다.

대신 어떤 값을 변경해야 하는지 감지하고 변경한 다음 전체 파일(수정된 값 포함)을 새 파일로 출력해야 합니다. 그런 다음 이 새 파일을 원래 이름으로 이동하여 이전 파일을 대체할 수 있습니다.

또한 셸에서 텍스트를 구문 분석하는 것은 일반적으로피하기 위해. 대신 다음과 같은 것을 사용해 보세요 awk.

awk -F '\t' 'BEGIN { OFS=FS }
             $4 == "No" { print "Congrats, here is your gift" >"/dev/stderr" }
             { $4 = "Yes"; print }' file.txt >newfile.txt

그러면 파일을 한 줄씩 읽고 네 번째 열이 나타날 때마다 No텍스트를 출력합니다 Congrats, here is your gift.

Yes그런 다음 각 행에 대해 전체 행을 인쇄하기 전에 무조건 네 번째 열이 로 설정됩니다.

위의 프로그램을 작성하고 실행하는 방식으로 Congrats...메시지가 터미널에 나타나고(표준 오류 스트림에 기록됨) 파일의 업데이트된 내용이 이름이 지정된 파일에 기록됩니다 newfile.txt.

BEGIN코드 시작 부분의 블록은 단순히 출력 필드 구분 기호를 명령줄에서 탭으로 설정된 OFS입력 필드 구분 기호와 동일한 값 으로 설정합니다 .FS-F '\t'

관련 정보