간단한 shell 프로그램을 짜던중 막혀서 글을 남깁니다.
WORK_YYYYMMDD=$1
RUN_DATE=$(date +%Y%m%d) # 작업(오늘)날짜
IN_FILE=/DB/home/data/CMC${WORK_YYYYMMDD}_copy.dat # Input File
while read line; do
echo ${line} | cut -c 33-72 >> Test${WORK_YYYYMMDD}.dat
echo ${line} | cut -c 73-92 >> Test${WORK_YYYYMMDD}.dat
echo ${line} | cut -c 93-94 >> Test${WORK_YYYYMMDD}.dat
echo ${line} | cut -c 95-98 >> Test${WORK_YYYYMMDD}.dat
echo ${line} | cut -c 99-106 >> Test${WORK_YYYYMMDD}.dat
echo ${line} | cut -c 107-107 >> Test${WORK_YYYYMMDD}.dat
echo '\n' >> Test${WORK_YYYYMMDD}.dat
done < ${IN_FILE}
파일에 있는 여러개의 행을 읽어서 각 행단 특정 부분만 짤라내여 이어서 새로운 파일로 만드는 간단한 스크립트를 짜는 중인데요 제 목적은 만일 원본 파일이 아래와 같다면요
123이456여789사
aaa김bbb여ccc사
bbb박bbb여ccc사
실제 생기는 출력 파일인 Test${WORK_YYYYMMDD}.dat 파일은요
이여사
김여사
박여사
이렇게 만들고 싶은데 실제로 돌려보면
이
여
사
김
여
사
박
여
사
이렇게 되는데요.. while에서 가장 마지막에 \n을 붙여서 줄바꿈하고 싶고 중간에는 하기가 싫은데 방법이 없을까요.
-n 옵션이 줄바꿈 없애는 거래서 없애는데도 자꾸 똑같이 나오네요 ㅠㅠ.. 혼자 한 삼일을 끙끙 앓다가 도저히 모르겠어서 올립니다.. 고수님들 도와주세요~
new line을 넣는게 echo가 아니라 cut이기
new line을 넣는게 echo가 아니라 cut이기 때문입니다. (-n은 echo의 옵션)
작성하신 스크립트를 아래와 같이 수정하시면 됩니다. (cut에 의해 만들어지는 new line을 제거)
아래와 같이 cut이 있는 모든 라인에 tr -d '\n'을 넣어주세요
그러나, cut등의 유틸들은 이미 라인단위로 동작하므로, 다시 루프를 돌리지 마시고,
아래와 같이 한번에 처리하시는 게 좋습니다.
그런데 33,72같이 숫자를 하드코딩하는게 맞는지는 다시 한번 생각해보시는게 좋겠네요..
차라리 raw data를 만들때 적당한 구분자를 넣어서 만드시는게..
Bash라면 이것도 괜찮은 방법일지도
Bash라면 이것도 괜찮은 방법일지도 모르겠네요.
(구지 while read line한다면)
while read line;do echo ${line:3:1}${line:7:1}${line:11:1} ;done < $INPUT_FILEPATH
BASH내부에서 문자열 조작하는 방법은 다음 위키 페이지를 참고해 보세요.
http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/string-manipulation.html
댓글 달기