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