電子書籍の厳選無料作品が豊富!

Windows10にCygwinを入れ、スクリプトを書いてます。
HTMLを出力するスクリプトを書いているのですが、最後の最後でエラーでつまずいてしまいました。
どなたかご教授お願いできませんでしょうか。

while read line
do
fpat1=`echo $line | cut -f 1 -d ","`
fpat2=`echo $line | cut -f 2 -d ","`
fpat3=`echo $line | cut -f 3 -d ","`
fpat4=`echo $line | cut -f 4 -d ","`
awk -F "," -v fpat1=${fpat1} -v fpat2=${fpat2} -v fpat3=${fpat3} -v fpat4=${fpat4} '{
if ( $1 == fpat1 ){
printf $1 "," $2 "," $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," $11 "," $12 "," $13 "," $14 "," $15 "," $16 "," $17 "," $18 "," $19 "," "0,0," fpat3 "," fpat4 >> "final.csv"
}
}' product_18366273.csv
done < middle2.csv

fpat3とfpat4には下記のような文字列が入っています。
<h3 class="table_name">型式一覧</h3><table class="info_table">型式<tr><th>有効内容積</th><th>外形寸法</th><th>重量</th></th></tr><tr><td><a href="https://item.rakuten.co.jp/hogehoge/p0737/">SCR- …×D318(+20)×H865mm</td><td>22kg</td><td>単相100V</td></tr><tr><td><a href="https://item.rakuten.co.jp/hogehoge/p0738/">SCR- …×D318(+20)×H865mm</td><td>27kg</td><td>単相100V</td></tr><tr><td><a href="https://item.rakuten.co.jp/hogehoge/p0740/">SCR- …×D473(+20)×H790mm</td><td>29kg</td><td>単相100V</td></tr><tr><td><a href="https://item.rakuten.co.jp/hogehoge/p0739/">SCR- …×D473+(20)×H935mm</td><td>32kg</td><td>単相100V</td></tr></table>

エラー出力は下記となります。
awk: コマンドライン:1: class="table_name">型式一覧</h3><table
awk: コマンドライン:1: ^ 式内に無効な文字 '▒' があります

どなたかお願いします。

質問者からの補足コメント

  • うーん・・・

    awk -F "," -v fpat1=${fpat1} -v fpat2=${fpat2} -v fpat3="'"${fpat3}"'" -v fpat4="'"${fpat4}"'" '{

    awkに渡す際に変数を"'"で囲ってみました。
    エラー内容が変わったのですが、/を文字列として認識していないようです。

    awk: コマンドライン:1: class="table_name">型式一覧</h3><table
    awk: コマンドライン:1: ^ 式内に無効な文字 '▒' があります
    awk: コマンドライン:1: class="table_name">型式一覧</h3><table
    awk: コマンドライン:1: ^ syntax error

    日本語も文字化けしているのでしょうか。

      補足日時:2022/02/14 15:42

A 回答 (1件)

・Unix/Linuxのシェルでは、変数等の展開した後でコマンドを解釈します。


・引用符は、空白等を分けずに一つの引数として認識させるための手段です。
分割や展開が発生しない状況では不要です。
逆に分割したく無い場合は引用符や\が必要です。


・上記2つから考えられることは
-v fpat1=${fpat1}
が 展開されて

-v fpat1=\<h3 class=\"table_name\"\>型式一覧\</h3\>\<table

と解釈される。(h3 とclassの間の空白が引数の区切りだと解釈される)

-v fpat1=\<h3 で変数に代入.
class=\"table_name\"\>型式一覧\</h3\>\<table の部分はオプションの無い引数として解釈される
 →awkのスクリプトとして解釈される
 →awkの文法に合わないので Syntax Error
ということがおこっているのでしょう。

${fpat1} をひとまとめに扱いたいのなら、"${fpat1} " と引用符でくくることです。


※ fpat3="'"${fpat3}"'" は意味がありません。
先頭と末尾に「引用符文字」が付くだけで、引用符としてに機能は付きません。


実際にどう展開されているかは、 シェルの -x オプションで確認できます。
方法1: set -x コマンドを実行する (解除はset +x)
方法2 :( sh スクリプト で実行している場合は) sh -x スクリプト
方法3 : スクリプト先頭で#!/bin/sh等としている場合は #!/bin/sh -x にする
    • good
    • 0
この回答へのお礼

ご丁寧な分かりやすい回答頂きありがとうございます。
無事、文字列として値を渡す事ができ、スクリプトが完成しました。

ありがとうございました。

お礼日時:2022/02/15 09:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています