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 として扱われます。
文字列値は次のように処理する必要があります。数値文字列次のいずれかで発生した場合:
フィールド変数
getline()
関数からの入力
FILENAME
ARGV
配列要素
ENVIRON
配列要素
split()
関数によって生成された配列要素コマンドライン変数の割り当て
異なる数値文字列変数からの変数の代入
[数字のように見える場合は、説明全体をお読みください。ここ]
また読んでくださいRATIONALE
echo 0 000 | awk '$1==$2'
特に、「真ではありません」などの比較に関して、数値文字列の概念とこの特別なケースが必要なのはなぜですかecho 0 | awk '$1=="000"'
?
別の珍しい点は、少なくともいくつかの実装では、$0
サブフィールドへの割り当てによって(現在の入力レコードの)再計算が発生すると、魔法の「数値文字列」属性が失われることです。
$ echo 0 | gawk '{$1=0} $0'
0
これは、標準 awk の基礎となる nawk/bwk の動作 (ただし mawk の動作ではない) と一致しますが、標準では扱っていないようです。
さらに、awk実装は入力からの対応する浮動NAN
小数点INF
数INFINITY
を認識することができますが、それに対するサポートは不確実で一貫性がありません。たとえば、まだ噛むことができます。
echo But his daughter named Nan | awk '$NF'
FreeBSDのawk(bwk、original-awk)では何も印刷しないでください。
答え4
なぜなら$0は完全な記録(全行)、$ 1、$ 2、はいフィールド(通常はスペースで区切ります)。