Awk

如果值為 0(數字零),為什麼 awk 對於 $1 的行為會有所不同?

  • April 11, 2022

當 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”(數字零)**的輸出:

[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'為什麼我使用and時會有區別var=1; echo $var | awk '$1=$1'?除了 之外,所有數字都工作正常0

版本:

  • GNU bash,版本 4.2.46
  • GNU awk 4.0.2
  • coreutils-8.22-24.el7.x86_64

來自GNU Awk 使用者指南

賦值是一個表達式,所以它有一個值——與賦值相同的值。因此,‘z = 1’ 是一個值為 1 的表達式。

所以

  • echo 0 | awk '$1=$1'模式評估為 0 (FALSE)
  • echo 1 | awk '$1=$1'模式評估為 1 (TRUE) 並print執行預設操作

我不認為這與數值有關:標準轉換會解決這個問題(至少在這裡)。

OP 顯示了四種不同的 awk 程式碼,所有變體:pattern { action }

(一種) $ 1 = $ 1

重新分配 $ 1 to itself. It is not a boolean test, it is a no-op (effectively), and it returns the value of $ 1. 如果 $1 為 0,則模式為假,****完全跳過預設列印動作。如果 $1 不為零,則列印輸入

(b) { $ 1 = $ 1個;列印; }

這將 $1 重新分配給自身,也是無操作。在沒有模式的情況下,將執行操作並始終列印輸入。

(C) $ 1 == $ 1

這是一個始終為真的布爾表達式。0 是 0,1 是 1(土豚是土豚)。在沒有動作的情況下,輸入總是被列印

(d) { $ 1 == $ 1個;列印; }

沒有模式。比較評估為被丟棄的真正布爾值。輸入總是列印出來的。

引用自:https://unix.stackexchange.com/questions/577726