私はファイル内のすべての単語を反転する非常に単純なawkスクリプトを書いています。
awk '
{
for (i=1;i<=NF;i++)
{ x=""
for(j=length($i);j>0;j--)
x=x substr($0,j,1);
print x
}}' file1
file1の内容は次のとおりです。
hello
今私を混乱させるのは - を交換する時です。
print x
そして
print $x
つまり、記録された出力を取得します。わかりました。こんにちは反対出力ではないオレ。
$xを使用すると、なぜ$ 0のコンテンツが提供されますか?変数はawkでどのように機能しますか?本当に混乱しています。 $xを使用する必要がある場合とxのみを使用する必要がある場合の規則がありますか?
答え1
x
あなたのawk変数は$x
何か違うものです...
$0
読み取った行の入力文字列の内容に対応し、$1
...はデフォルトの区切り文字を使用する分析フィールドに対応します$n
。$0
awkを使用すると、変数を使用してプログラムでフィールドにアクセスできます。つまり、変数にMyValue
が含まれている場合と同じです。5
$MyValue
$5
ここで何が起こるのかは、変数に数値として解釈される文字列がx
含まれていることです。 awkでは、数値以外の値で始まるすべての文字列は、たとえば数値として使用されていると解釈されます。たとえば、と解釈されるためと評価されます。したがって、あなたの場合と同様に、提供された入力文字列です。olleh
0
0
5*"test"
0
"test"
0
$x
$0
hello
答え2
まず、有効な変数が何であるかを知る必要がありますawk
。 POSIXの定義awk変数ように:
移植可能な文字セットまたはアルファベット文字
<underscore>
(XBD移植可能な文字セットの表を参照)で始まり、移植可能な文字セットの一連の下線、数字、および文字、最後に「=」文字、変数の割り当てが続きます。パス名の代わりに指定する必要があります。
したがって、awk
変数があり、x
それを使用するには、そのx
変数を参照してx
exampleprint x
またはを作成するだけですy = x
。
を使用すると$x
アクセスされます。awk フィールド変数。のawk
フィールド変数は、数値または数値式に従ってアクセスされます。$
だから、文章を書くとき、$x
まずawk
評価をすることになりますx
。たとえば、xに数値がある場合、1
ステートメントは$1
最初awk
のフィールド変数の値を提供するようになります。または、このような数値式が存在する場合は(1+1)
、2番目のフィールド変数の値を取得します。$(1+1)
$2
フィールド番号式が除算と評価される場合負でない整数、アクションが指定されていません(x = "qwerty"
または場合はx = "qwerty"+1
アクセス$x
が指定されていません)。
この文脈では、非負の整数以外のものとして評価される未指定のフィールド数値式の効果は、初期化されていない変数または文字列値を数値に変換する必要はありません。
あなたの場合、awk
実装はフィールド番号式(文字列)を評価するので、0
変数の値を取得します。$0
他のawk
実装では結果が異なる場合があります(少なくともOpenBSDではawk
エラーが発生しますillegal field
)。