bash 쉘 스크립트에서 줄 띄워짐.
글쓴이: gksrb500 / 작성시간: 화, 2021/05/04 - 4:27오후
안녕하세요.
bash 쉘로 코딩하고 있고 (초보입니다.) echo 와 >> 를 이용해서 텍스트를 만들어내려 합니다.
제가 짠 코드 중 일부를 가져온다면,
r=1 for i in $Si_line do xx=$( awk '{ print $4; }' ./$file | head -n $i | tail -n 1 ) yy=$( awk '{ print $5; }' ./$file | head -n $i | tail -n 1 ) zz=$( awk '{ print $6; }' ./$file | head -n $i | tail -n 1 ) echo "HETATM $r Si ${xx} ${yy} ${zz} Si 1 1 0.00000" >> ${FOLDER_NAME}_$w let r++ done
이 밑으로 N_line, H_line으로 동일한 코드가 존재합니다.
이 결과는
HETATM 1 Si -0.000011 0.646863 -0.000001 Si 1 1 0.00000 HETATM 2 N H.229976 -0.622798 0.027438 N 1 1 0.00000 HETATM 3 N -1.229949 -0.622836 -0.027442 N 1 1 0.00000 HETATM 4 H 0.234234 1.531657 1.191364 H 1 1 0.00000 HETATM 5 H -0.234318 1.531639 -1.191362 H 1 1 0.00000 HETATM 6 H 1.108168 -1.294582 -0.730808 H 1 1 0.00000 HETATM 7 H 2.222875 -0.405362 0.132508 H 1 1 0.00000 HETATM 8 H -1.108149 -1.294647 0.730781 H 1 1 0.00000
다음과 같이 HETATM 한 줄로 나오는게 아니라 중간에 띄어쓰기가 되어있습니다.
이를 어떻게 해결해야하나요?
File attachments:
첨부 | 파일 크기 |
---|---|
Angle.zip | 4.83 MB |
Forums:
줄바뀜이 일어난 이유는 모르겠네요.
줄바뀜이 일어난 이유는 모르겠네요.
문제의 현상이 재현되는 짧은 샘플 데이터와 샘플 bash 스크립트를 묶어 첨부해보시면 어떨까요?
그리고 질문취지와는 안 맞는 얘기지만, 같은 파일 같은 줄의 세 컬럼에 대해 각각 한 번씩 awk를 쓰는 대신 한 번에 처리할 수도 있습니다.
위에서는 xx,yy,zz 값 사이에 두 칸씩 띄우는 간격조정을 awk에서 했지만, 아래와 같이 어레이를 써서 기존방식대로 echo에서 해도 되고요.
감사드립니다.
감사드립니다.
우선 말씀하신대로 파일을 첨부하겠습니다.
또한 알려주신대로 코딩을 바꾸는 것이 더 좋을 것 같습니다.
awk 는 라인 마지막이 \r\n 으로 처리되는 경우
awk 는 라인 마지막이 \r\n 으로 처리되는 경우, \r 포함하게 됩니다. 마지막 필드를 사용할때 의도하지 않는 개행이 나오면 파일의 문서 포맷이 dos format 이 아닌지 확인해 보세요
초보인지라 \r\n 으로 처리되는 경우 이런 말이
초보인지라 \r\n 으로 처리되는 경우 이런 말이 어떤 뜻인지 잘 모르겠습니다...
우선 제가
이거로 스크립트를 유닉스로 바꾸긴 했었는데 파일의 문서 포맷이 dos format인지 아닌지 어떻게 확인하나요?
음 ..
줄바꿈과 관련된 문자는 CR(\r) 과 LF(\n) 이 있는데..
CR 는 커서를 현재 위치에서 맨 첫번째 칸으로 옮기는 것이고..
LF 는 커서를 현재 위치에서 바로 아래 줄로 내리는 것입니다.
dos(windows) file 은 \r\n 두 문자를 합쳐서 줄바꿈을 표시하는데 비해..
unix file 은 \n 하나만 써서 줄바꿈을 표시합니다.
그래서 dos 파일을 unix 에서 열어 보면..
\r 은 줄바꿈에 포함되지 않고, 그대로 특수문자로 남아있게 되는데..
이 문자는 non-printable 이라서 눈에 보이지 않을 뿐만 아니라..
CR 의 역할을 그대로 하게 됩니다.
이 문자는 vi 로 열었을 때, ^M 으로 표시되는데 (아래 상태바에 [dos] 라고 표시됨)
cat 에 -v 옵션을 줬을 때에도 확인할 수 있습니다.
최초의 원본 데이터 파일인 Si1N.txt 이 dos 파일이었기 때문에..
이 파일의 모든 라인의 끝에는 \r(^M) 이 붙어 있게 된거고..
그 결과로 출력된 내용이 흐트러지게 된겁니다.
근데 문제는 \r 이라서 원래 HEATAM 은 안 보이고.. Si 로 시작되는 줄만 보였어야 하는데..
이 두 줄을 다 적으셨기 때문에, 문제를 짐작하기 어려웠습니다.
여섯번째 필드에 ^M(\r) 이 붙어 있기 때문에..
그냥 cat 으로 열면 "HETATM 1 Si -0.043233 -0.598690 0.000000" 까지 찍은 후에..
^M(\r) 에 의해 커서가 맨 앞으로 이동하여 " Si 1 1 0.00000" 을 다시 출력해서..
이전에 썼던 HETATM 의 앞 부분이 덮어씌워져야 하죠.
결과적으로 질문글에 적으신 것처럼 나올 수가 없어 보이거든요.
만약 new-line 을 CR-LF 로 인식해 주는 터미널이라고 한다면..
다음과 같이 줄바꿈이 하나씩 더 들어간 채로 표시되었을 겁니다.
어쨌든 이 경우에도 문제를 인식하기가 쉬웠을 겁니다.
어쨌든 이번 문제는..
최초의 원본 데이터 파일(Si1N.txt) 을 unix 파일로 바꾸면 해결될 것으로 보입니다.
참고로, 파일 유형은 file 명령으로 확인 가능 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
친절하게 설명해주신 점 굉장히 감사드립니다.
친절하게 설명해주신 점 굉장히 감사드립니다.
dos format file과 unix format file 간의 호환성 때문에 일어난 일로 이해했습니다.
dos2unix ${FOLDER_NAME}.log 로 해결했습니다.
진심으로 감사드립니다.
댓글 달기