構文エラー:引用符付き文字列は終了していません。見つかりませんエラー

構文エラー:引用符付き文字列は終了していません。見つかりませんエラー

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

おすすめ記事