bash 쉘 스크립트에서 줄 띄워짐.

gksrb500의 이미지

안녕하세요.

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: 
첨부파일 크기
Package icon Angle.zip4.83 MB
chanik의 이미지

줄바뀜이 일어난 이유는 모르겠네요.
문제의 현상이 재현되는 짧은 샘플 데이터와 샘플 bash 스크립트를 묶어 첨부해보시면 어떨까요?

그리고 질문취지와는 안 맞는 얘기지만, 같은 파일 같은 줄의 세 컬럼에 대해 각각 한 번씩 awk를 쓰는 대신 한 번에 처리할 수도 있습니다.

xyz=$(awk -v row=$i 'NR==row {OFS="  "; print $4, $5, $6)}' ./$file)
echo "HETATM    $r Si      ${xyz}    Si  1  1  0.00000" >> ${FOLDER_NAME}_$w

위에서는 xx,yy,zz 값 사이에 두 칸씩 띄우는 간격조정을 awk에서 했지만, 아래와 같이 어레이를 써서 기존방식대로 echo에서 해도 되고요.

xyz=( $(awk -v row=$i 'NR==row {print $4, $5, $6}' ./$file) )
echo "HETATM    $r Si      ${xyz[0]}  ${xyz[1]}  ${xyz[2]}    Si  1  1  0.00000" >> ${FOLDER_NAME}_$w
gksrb500의 이미지

감사드립니다.

우선 말씀하신대로 파일을 첨부하겠습니다.

또한 알려주신대로 코딩을 바꾸는 것이 더 좋을 것 같습니다.

김정균의 이미지

awk 는 라인 마지막이 \r\n 으로 처리되는 경우, \r 포함하게 됩니다. 마지막 필드를 사용할때 의도하지 않는 개행이 나오면 파일의 문서 포맷이 dos format 이 아닌지 확인해 보세요

gksrb500의 이미지

초보인지라 \r\n 으로 처리되는 경우 이런 말이 어떤 뜻인지 잘 모르겠습니다...

우선 제가

dos2unix Script

이거로 스크립트를 유닉스로 바꾸긴 했었는데 파일의 문서 포맷이 dos format인지 아닌지 어떻게 확인하나요?

ymir의 이미지

줄바꿈과 관련된 문자는 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 로 시작되는 줄만 보였어야 하는데..
이 두 줄을 다 적으셨기 때문에, 문제를 짐작하기 어려웠습니다.

$ cat -v H_Si_N_10
BIOGRF 200
DESCRP H_Si_N_10
REMARK
RUTYPE NORMAL RUN
BOND RESTRAINT
FORMAT ATOM   (a6,1x,i5,1x,a5,1x,a3,1x,a1,1x,a5,3f10.5,1x,a5,i3,i2,1x,f8.5)
HETATM    1 Si      -0.043233  -0.598690  0.000000^M    Si  1  1  0.00000
HETATM    2 N      -0.043233  1.176207  -0.000000^M    N  1  1  0.00000
HETATM    3 H      0.396952  1.583604  0.825309^M    H  1  1  0.00000
HETATM    4 H      0.396952  1.583604  -0.825309^M    H  1  1  0.00000
HETATM    5 H      -0.677331  -1.159681  1.229983^M    H  1  1  0.00000
HETATM    6 H      -0.677331  -1.159681  -1.229983^M    H  1  1  0.00000
HETATM    7 H      1.468647  -0.699639  0.000000^M    H  1  1  0.00000
ENERGY          -347.078187541
$ cat H_Si_N_10
BIOGRF 200
DESCRP H_Si_N_10
REMARK
RUTYPE NORMAL RUN
BOND RESTRAINT
FORMAT ATOM   (a6,1x,i5,1x,a5,1x,a3,1x,a1,1x,a5,3f10.5,1x,a5,i3,i2,1x,f8.5)
    Si  1  1  0.000000.043233  -0.598690  0.000000
    N  1  1  0.000000.043233  1.176207  -0.000000
    H  1  1  0.00000.396952  1.583604  0.825309
    H  1  1  0.00000.396952  1.583604  -0.825309
    H  1  1  0.000000.677331  -1.159681  1.229983
    H  1  1  0.000000.677331  -1.159681  -1.229983
    H  1  1  0.00000.468647  -0.699639  0.000000
ENERGY          -347.078187541

여섯번째 필드에 ^M(\r) 이 붙어 있기 때문에..
그냥 cat 으로 열면 "HETATM 1 Si -0.043233 -0.598690 0.000000" 까지 찍은 후에..
^M(\r) 에 의해 커서가 맨 앞으로 이동하여 " Si 1 1 0.00000" 을 다시 출력해서..
이전에 썼던 HETATM 의 앞 부분이 덮어씌워져야 하죠.
결과적으로 질문글에 적으신 것처럼 나올 수가 없어 보이거든요.

만약 new-line 을 CR-LF 로 인식해 주는 터미널이라고 한다면..
다음과 같이 줄바꿈이 하나씩 더 들어간 채로 표시되었을 겁니다.
어쨌든 이 경우에도 문제를 인식하기가 쉬웠을 겁니다.

$ cat H_Si_N_10
 
BIOGRF 200
 
DESCRP H_Si_N_10
 
REMARK
 
RUTYPE NORMAL RUN
 
BOND RESTRAINT
 
FORMAT ATOM   (a6,1x,i5,1x,a5,1x,a3,1x,a1,1x,a5,3f10.5,1x,a5,i3,i2,1x,f8.5)
 
HETATM    1 Si      -0.043233  -0.598690  0.000000
    Si  1  1  0.00000
 
HETATM    2 N      -0.043233  1.176207  -0.000000
    N  1  1  0.00000
 
HETATM    3 H      0.396952  1.583604  0.825309
    H  1  1  0.00000
 
HETATM    4 H      0.396952  1.583604  -0.825309
    H  1  1  0.00000
 
HETATM    5 H      -0.677331  -1.159681  1.229983
    H  1  1  0.00000
 
HETATM    6 H      -0.677331  -1.159681  -1.229983
    H  1  1  0.00000
 
HETATM    7 H      1.468647  -0.699639  0.000000
    H  1  1  0.00000
 
ENERGY          -347.078187541

어쨌든 이번 문제는..
최초의 원본 데이터 파일(Si1N.txt) 을 unix 파일로 바꾸면 해결될 것으로 보입니다.

참고로, 파일 유형은 file 명령으로 확인 가능 합니다.

$ file out_xx10
out_xx10: ASCII text, with CRLF, LF line terminators
$ cat -v out_xx10
                         Standard orientation:                         ^M
 ---------------------------------------------------------------------^M
 Center     Atomic      Atomic             Coordinates (Angstroms)^M
 Number     Number       Type             X           Y           Z^M
 ---------------------------------------------------------------------^M
      1          N           0       -0.052963    1.214246   -0.000000^M
      2          H           0        0.484249    1.521097    0.814525^M
      3          H           0        0.484249    1.521097   -0.814525^M
      4          Si           0       -0.052963   -0.631573    0.000000^M
      5          H           0       -0.634200   -1.219249    1.239574^M
      6          H           0       -0.634200   -1.219249   -1.239574^M
      7          H           0        1.412117   -0.261395    0.000000^M
 ---------------------------------------------------------------------^M
ENERGY          -347.045952344
$ dos2unix out_xx10
dos2unix: converting file out_xx10 to Unix format...
$ file out_xx10
out_xx10: ASCII text
$ cat -v out_xx10
                         Standard orientation:
 ---------------------------------------------------------------------
 Center     Atomic      Atomic             Coordinates (Angstroms)
 Number     Number       Type             X           Y           Z
 ---------------------------------------------------------------------
      1          N           0       -0.052963    1.214246   -0.000000
      2          H           0        0.484249    1.521097    0.814525
      3          H           0        0.484249    1.521097   -0.814525
      4          Si           0       -0.052963   -0.631573    0.000000
      5          H           0       -0.634200   -1.219249    1.239574
      6          H           0       -0.634200   -1.219249   -1.239574
      7          H           0        1.412117   -0.261395    0.000000
 ---------------------------------------------------------------------
ENERGY          -347.045952344

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

gksrb500의 이미지

친절하게 설명해주신 점 굉장히 감사드립니다.

dos format file과 unix format file 간의 호환성 때문에 일어난 일로 이해했습니다.

dos2unix ${FOLDER_NAME}.log 로 해결했습니다.

진심으로 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.