私の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 "\""}'