大きなファイルを利用可能なデータに解析するスクリプトを作成しています。以下にスクリプトを添付します。スクリプトは私が望む方法で実行されませんでした。私はそれが私が使っていた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 \
}'
)