더 큰 파일을 사용 가능한 데이터로 구문 분석하는 스크립트를 작성 중입니다. 아래에 스크립트를 첨부하겠습니다. 스크립트가 내가 원하는 방식으로 실행되지 않았습니다. 나는 그것이 내가 사용하고 있던 if/then 문일지도 모른다고 생각했지만, 취소하자 실제 문제가 드러났습니다. 이것이 제가 지금 겪고 있는 오류입니다. 이로 인해 실제 문제가 일종의 인용문처럼 보입니다.
FirstName,LastName,Company,Address,City,County,State,ZIP,Phone,Fax,Email,Web
FinalProject.sh: 36: FinalProject.sh: Syntax error: Unterminated quoted string
기술적으로는 구문 오류가 무엇을 의미하는지 이해하지만 문제가 무엇인지 찾을 수 없어 약 30분 동안 문제를 해결하려고 노력했습니다. 도움을 주시면 대단히 감사하겠습니다!
#!/bin/bash
OLDIFS=${IFS}
IFS=$'\n'
head -1 50000_a.csv | sed 's/"//g'
for LINE in 'grep WV 50000_a.csv | sed 's/"//g' | awk -F, '{print $(NF-11)"," \
$(NF-10)"," \
$(NF-9)"," \
$(NF-8)"," \
$(NF-7)"," \
$(NF-6)"," \
$(NF-5)"," \
$(NF-4)"," \
$(NF-3)"," \
$(NF-2)"," \
$(NF-1)"," \
$NF \
}''
do
FNAME='echo ${LINE} | awk -F, '{print $1}''
LNAME='echo ${LINE} | awk -F, '{print $2}''
COMPANY='echo ${LINE} | awk -F, '{print $3}''
ADDRESS='echo ${LINE} | awk -F, '{print $4}''
CITY='echo ${LINE} | awk -F, '{print $5}''
COUNTY='echo ${LINE} | awk -F, '{print $6}''
STATE='echo ${LINE} | awk -F, '{print $7}''
ZIP='echo ${LINE} | awk -F, '{print $8}''
PHONE='echo ${LINE} | awk -F, '{print $9}''
FAX='echo ${LINE} | awk -F, '{print $10}''
EMAIL='echo ${LINE} | awk -F, '{print $11}''
WEB='echo ${LINE} | awk -F, '{print $12}''
done
답변1
일반적으로 말하면, "명령 실행"을 묶을 때 작은따옴표를 사용 하고 '...'
백틱 또는 (더 나은)로 `...`
묶어야 합니다 $(...)
.
for LINE in 'grep
이렇게 하면 :으로 시작하고 다음으로 끝나는 줄이 }''
실패하게 됩니다.
가능한 한 적은 변경 사항을 적용하면 코드는 다음과 같습니다.
#!/bin/bash
OLDIFS=${IFS}
IFS=$'\n'
head -1 50000_a.csv | sed 's/"//g'
for LINE in `grep WV 50000_a.csv | sed 's/"//g' | awk -F, '{print $(NF-11) "," \
$(NF-10)"," \
$(NF-9)"," \
$(NF-8)"," \
$(NF-7)"," \
$(NF-6)"," \
$(NF-5)"," \
$(NF-4)"," \
$(NF-3)"," \
$(NF-2)"," \
$(NF-1)"," \
$NF \
}'`
do
FNAME=`echo ${LINE} | awk -F, '{print $1}'`
LNAME=`echo ${LINE} | awk -F, '{print $2}'`
COMPANY=`echo ${LINE} | awk -F, '{print $3}'`
ADDRESS=`echo ${LINE} | awk -F, '{print $4}'`
CITY=`echo ${LINE} | awk -F, '{print $5}'`
COUNTY=`echo ${LINE} | awk -F, '{print $6}'`
STATE=`echo ${LINE} | awk -F, '{print $7}'`
ZIP=`echo ${LINE} | awk -F, '{print $8}'`
PHONE=`echo ${LINE} | awk -F, '{print $9}'`
FAX=`echo ${LINE} | awk -F, '{print $10}'`
EMAIL=`echo ${LINE} | awk -F, '{print $11}'`
WEB=`echo ${LINE} | awk -F, '{print $12}'`
done
그러나 시도하는 것은 실수입니다for 루프를 사용하여 파일 처리, 당신은해야read
출력을 얻기 위해grep
:
#!/bin/bash
OLDIFS=${IFS}
IFS=$'\n'
head -1 50000_a.csv | sed 's/"//g'
while IFS=$'\n' read -r LINE
do
FNAME="$(echo ${LINE} | awk -F, '{print $1}')"
LNAME="$(echo ${LINE} | awk -F, '{print $2}')"
COMPANY="$(echo ${LINE} | awk -F, '{print $3}')"
ADDRESS="$(echo ${LINE} | awk -F, '{print $4}')"
CITY="$(echo ${LINE} | awk -F, '{print $5}')"
COUNTY="$(echo ${LINE} | awk -F, '{print $6}')"
STATE="$(echo ${LINE} | awk -F, '{print $7}')"
ZIP="$(echo ${LINE} | awk -F, '{print $8}')"
PHONE="$(echo ${LINE} | awk -F, '{print $9}')"
FAX="$(echo ${LINE} | awk -F, '{print $10}')"
EMAIL="$(echo ${LINE} | awk -F, '{print $11}')"
WEB="$(echo ${LINE} | awk -F, '{print $12}')"
done < <(
grep WV 50000_a.csv | sed 's/"//g' | awk -F, '{print $(NF-11) "," \
$(NF-10)"," \
$(NF-9)"," \
$(NF-8)"," \
$(NF-7)"," \
$(NF-6)"," \
$(NF-5)"," \
$(NF-4)"," \
$(NF-3)"," \
$(NF-2)"," \
$(NF-1)"," \
$NF \
}'
)