$ 1の値が0(数値0)の場合、awkが異なる動作をするのはなぜですか?

$ 1の値が0(数値0)の場合、awkが異なる動作をするのはなぜですか?

awkが受信したとき「0」入力として場合によっては異なる動作をします。コードは以下のように表示されます。

var=$1
echo ""; echo -n 'o/p of $1=$1 ==>'; echo $var | awk '$1=$1'
echo "";echo -n 'o/p of {$1=$1;print} ==>';echo $var | awk '{$1=$1;print}'
echo "";echo -n 'o/p of $1==$1 ==>';echo $var | awk '$1==$1'
echo "";echo -n 'o/p of {$1==$1;print} ==>';echo $var | awk '{$1==$1;print}'

に出力「0」(数字0):

[root@host ~]# sh /tmp/te.sh 0

o/p of $1=$1 ==>
o/p of {$1=$1;print} ==>0

o/p of $1==$1 ==>0

o/p of {$1==$1;print} ==>0
[root@GORJALA ~]#

に出力「1」(最初):

[root@host ~]# sh /tmp/te.sh 1

o/p of $1=$1 ==>1

o/p of {$1=$1;print} ==>1

o/p of $1==$1 ==>1

o/p of {$1==$1;print} ==>1
[root@host ~]#

var=0; echo $var | awk '$1=$1'とを使用すると、なぜ違いが発生するのですかvar=1; echo $var | awk '$1=$1'?を除くすべての数字が正常に機能します0

バージョン:

  • GNUバッシュ、バージョン4.2.46
  • GNU Awk 4.0.2
  • coreutils-8.22-24.el7.x86_64

答え1

~からGNU Awkユーザーガイド:

割り当ては式なので、割り当てられる値と同じ値を持ちます。したがって、「z = 1」は値が1の式です。

だから

  • echo 0 | awk '$1=$1'このモードは0(FALSE)と評価されます。

  • echo 1 | awk '$1=$1'printこのモードは1(TRUE)と評価され、基本操作を実行します。

答え2

私はそれが数値に問題があるとは思わない。標準変換が(少なくともここでは)それを処理します。

OPには、次の4つの異なるawkコードが表示されています。パターン{ action }

(1)1ドル= 1ドル

これは$ 1を自分自身に再割り当てします。これはブールテストではなく(実際には)何もせず、$ 1の値を返します。 $ 1が0の場合、パターンは次のようになります。間違ったとデフォルト印刷ジョブを完全にスキップしました。。 $1がゼロでない場合入力が印刷されます

(b) { $1 = $1 }

これは$ 1を自分自身に再割り当てし、これも機能しません。モードがない場合は、操作を実行して入ります。常に印刷

(c) $1 == $1

ブール式です。いつも正しい。 0は0、1は1です(土豚は土豚です)。アクションがない場合、入力は次のようになります。常に印刷

(d) { $1 == $1 }

パターンはありません。比較結果が実際のブール値の場合、ブール値は削除されます。入力は常に印刷

答え3

既存の回答では理由を説明できません。

echo 0 | awk '$0="0"'
echo 0 | awk '$0=substr($0,1)'
echo 0 | awk '$0=$0""'

すべて印刷する0

echo 0 | awk '$0'
echo 000 | awk '$0'

何も印刷されませんが、すべての場合でパターン式はと評価されます0

なぜ0あるケースは本当であり、他のケースは偽ですか?

これは、「フィールド変数」(演算子の結果$)が次のように処理されるためです。特別な場合(可能であれば)は自動的に次に変換されます。数値文字列、数値が等しい場合、0ブール値コンテキストで使用される場合は false として扱われます。

文字列値は次のように処理する必要があります。数値文字列次のいずれかで発生した場合:

  1. フィールド変数

  2. getline()関数からの入力

  3. FILENAME

  4. ARGV配列要素

  5. ENVIRON配列要素

  6. split()関数によって生成された配列要素

  7. コマンドライン変数の割り当て

  8. 異なる数値文字列変数からの変数の代入

[数字のように見える場合は、説明全体をお読みください。ここ]

また読んでくださいRATIONALEecho 0 000 | awk '$1==$2'特に、「真ではありません」などの比較に関して、数値文字列の概念とこの特別なケースが必要なのはなぜですかecho 0 | awk '$1=="000"'


別の珍しい点は、少なくともいくつかの実装では、$0サブフィールドへの割り当てによって(現在の入力レコードの)再計算が発生すると、魔法の「数値文字列」属性が失われることです。

$ echo 0 | gawk '{$1=0} $0'
0

これは、標準 awk の基礎となる nawk/bwk の動作 (ただし mawk の動作ではない) と一致しますが、標準では扱っていないようです。

さらに、awk実装は入力からの対応する浮動NAN小数点INFINFINITYを認識することができますが、それに対するサポートは不確実で一貫性がありません。たとえば、まだ噛むことができます。

echo But his daughter named Nan | awk '$NF'

FreeBSDのawk(bwk、original-awk)では何も印刷しないでください。

答え4

なぜなら$0は完全な記録(全行)、$ 1、$ 2、はいフィールド(通常はスペースで区切ります)。

関連情報