これがawkの機能かはわかりませんが、awkプログラムファイルを使用して$0
vsを使用すると。$1
-f
bash 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)