awkの$1、${1}、$"1"の違い

awkの$1、${1}、$"1"の違い

スクリプトの処理中に、次のスクリプトでエラーが発生します。

file * | awk '{ ${1}=""; print substr(${0},2) }';

次の両方のスクリプトは正常に実行されます。

file * | awk '{ $"1"=""; print substr($"0",2) }';

そして

file * | awk '{ $1=""; print substr($0,2) }';

パラメータ置換に関するすべてではありませんか$1, ${1}, $"1"?私のawk文法に問題があるのでしょうか?

答え1

awk殻ではありません。awk独自の文法、構文、意味があります。は構文上正しいコード${1}ではありませんが、とは両方です(そして同じです)。では代替品ではありません。awk$1$"1"awkawk

これらのうち、awk現在の$1入力レコードの最初のフィールドを表し、完全な入力レコードを$0表し、シェルでは最初の位置パラメータ(通常はスクリプトまたは関数コマンドラインの最初のパラメータ)を表し、通常は現在のシェルまたはシェルスクリプトの名前です$1$0

シェル変数とawk変数も完全に別個です。そのため、シェルからスクリプトに値を「インポートする」必要がある場合は、awkコマンドラインフラグを使用してその変数を設定する必要があります。-vawk

$ awk -v var="$var" '{...}'

awk次のようにスクリプトにシェル変数の値を指定することもできます。

$ awk '{...}' var="$var"

これはほぼ-v変数がvarすべてのブロックで空であることを除いて、withを使用するのと同じ操作ですBEGIN。ブロックBEGINが実行されます今後入力データの表示と変数の設定後ろにそのようなブロックの実行。

あなたもできます。

$ awk '{...}' var="$value1" file1 var="$value2" file2

これにより、変数は処理されたばかりのシェル変数の値を取得し、処理されたばかりのシェル変数のvar値を取得します。$value1file1$value2file2

もしそうなら文書前の例の名前var="$value1"var="42"例:完全に有効なUnixファイル名)を使用すると、ファイルは次のようになります。いいえ処理されます。また、コマンドラインのシェルファイル名グロービングパターンが名前が変数の割り当てのように見えるファイルを選択すると、その割り当てはスクリプトで有効になりますawk

関連情報