AWKで「予期しない改行または文字列の終わり」エラーが発生します。

AWKで「予期しない改行または文字列の終わり」エラーが発生します。

私のBashスクリプト:

declare -a lang=('english' 'spainsh')
sms="Free msg: Due to upgrades on apps you’ll need a new version by yyyy/mm/dd to app running. Visit a store or go to"
    url="google.com/UA2392 to upgrade your app." 

awk '{print $1 "," '${servicegrade[0]}' "," '${lang[1]}' ",,," '$sms' "," '$url'}' inputfile.csv > inputfile.txt

間違い:

awk: cmd. line:1: {print $1 "," 267 "," en ",,," Free
awk: cmd. line:1:                                    ^ unexpected newline or end of string

ベストアンサー1

awk見ている問題は、コマンドラインを引用する方法(またはより正確には引用しない方法)とシェル変数を補間する方法と直接関連しています。 (シェルとawk.)

あなたはこれを持っています:

awk '{print $1 "," '${servicegrade[0]}' "," '${lang[1]}' ",,," '$sms' "," '$url'}' inputfile.csv > inputfile.txt

経験的にエラーメッセージでservicegrade=267、、lang=enは見えますが見えsms=Free msg:...ないのでurl(大丈夫です)としましょうurl=http://example.net

重要なのは、コマンドラインで引用符を見ることです。 「一重引用符」内のすべての内容は単一のコマンドラインとして扱われます。二重引用符の横に一重引用符を入れると(引数echo 'hello'"world"は1つだけ)、そうすることもできます。ただし、引用符で囲まれていないスペースを導入すると、2番目の引数(echo 'hello' "world"1つの単語ではなく2つの単語)になります。また、変数は引用されないので、その値の空白はシェルでハイフンとして扱われます。

これらの変数にスペースが含まれていないと仮定し、変数ではなく実際の値であるかのようにコマンドラインに挿入しましょう。

awk '{print $1 "," '267' "," 'en' ",,," 'Free msg:...' "," 'http://example.net'}' inputfile.csv > inputfile.txt

それでは、追加の引用符を削除します。

awk '{print $1 "," 267 "," en ",,," Free msg:..."," http://example.net}' inputfile.csv > inputfile.txt

これで、変数awkとして扱えない引用符のない文字列が表示されていることがすぐにわかります。awk私はあなたが本当に欲しいものが次のようなものだと思います。

awk '{print $1 ",267,en,,,Free msg:...,http://example.net"}' inputfile.csv > inputfile.txt

(出力もCSVスタイルの場合は、パラメータに二重引用符を使用できます)。

シェル変数の補間を可能にするためにプロセスを簡単に戻すことができますが、より良いアプローチは、これらのシェル変数をawk変数に割り当てて使用することです。

awk -v servicegrade="${servicegrade[0]}" -v lang="${lang[1]}" -v sms="$sms" -v url="$url" '{print $1 "," servicegrade "," lang ",,," sms "," url}' inputfile.csv > inputfile.txt

出力テキストに二重引用符で囲まれた引数が必要であると判断した場合awk(少なくとも私のバージョンでは)、次の構造を理解します。awk '{print $1 "\"" servicegrade "\",\"" lang "\",\"" sms "\",\"" url "\""}'

おすすめ記事