私の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
表示されている問題は、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
。
重要な部分は、commnd行であなたの見積もりを見ることです。「一重引用符」内のすべては、単一のコマンドラインとして扱われます。二重引用符に対して一重引用符を隣接させる場合も問題ありません(echo 'hello'"world"
単一の引数があります)。ただし、引用符で囲まれていないスペースを導入するとすぐに、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 "\""}'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加