awk $ 0と$ 1は、ファイルとbashで実行されている場合は異なる動作をします。

awk $ 0と$ 1は、ファイルとbashで実行されている場合は異なる動作をします。

これがawkの機能かはわかりませんが、awkプログラムファイルを使用して$0vsを使用すると。$1-fbash command line

次のテストファイルをインポートします。

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

Bashコマンドラインで次のコマンドを使用するとき:

awk "{ print $1 }" sample_input.txt

次の結果が表示されます。

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

ご覧のとおり、これは$1ではなく$0の出力です。 $ 0は空行のみを出力します。

awkコマンドで同じコマンドを使用すると、正しい出力が得られます。

{ print $1 }
awk -f test.awk sample_input.txt

a
a
a
a
a
a,bc,

Ubuntu 18.04を使用しています。これはちょっと変な機能ですかawk

答え1

これは奇妙な機能ではありませんが、awkシェルが二重引用符内の変数を処理する一般的な方法によるものです。

指揮中

awk "{ print $1 }" sample_input.txt

awkコードは二重引用符で囲まれているため、シェルは$1最初の位置引数(通常はスクリプトまたはシェル関数の最初のコマンドライン引数)の値を置き換えます。値が空または設定されていない場合、awkスクリプトは

awk "{ print }" sample_input.txt

その効果は次のとおりです。

cat sample_input.txt

シェルの拡張を防ぐには、スクリプトを$1一重引用符で囲みますawk

awk '{ print $1 }' sample_input.txt

POSIX標準では、二重引用符と一重引用符を使用してシェルの動作を説明しています。

文字を一重引用符('')で囲むと、一重引用符内の各文字のリテラル値が保持されます。一重引用符の中に一重引用符を含めることはできません。

二重引用符()で囲まれた文字は、バックティック、、、および""文字を除いて、二重引用符内のすべての文字のリテラル値を保持します。<dollar-sign><backslash>

$

パラメータ拡張は、導入後も<dollar-sign>特別な意味を維持する必要があります。(パラメータ拡張を参照)、コマンド置換形式(コマンド置換を参照)、および算術拡張(算術拡張を参照)。

[...]

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02)

関連情報