分类：电脑/网络-操作系统/系统故障
问题：awk里面为什么自动加了0bash
-2.03# cat > 1         bash# cat 1 | awk '{if ($1= ) print $0}'         怎么变成了20.30了？
回答：由于写成了$1= ，所以awk认为$0，在本例里也就是$1的值为 ，而 不是一个数字，awk再进一步解释为1.2和0.3和0.4，显示结果还不以空格分开，所以显示  应该是这样吧。[/quote:6bd795b3ef] 我们知道，首先，与c/c++，等相比，awk是一种弱类型语言。你不需要提前声明就可以使用变量，变量的类型转换也是隐含的，在某一语境(上下文)下它可能用作数字，在另一语境下它可能就用作字符串。 另外一个需要小心的地方就是awk的字符串连结操作，这个操作没有任何操作符，只要把需要连结的串并列写在一起就可以了。 [code:1:6bd795b3ef]$ echo|awk '{a=1.234;var=a" is a number";print var}' 1.234 is a number [/code:1:6bd795b3ef] 这里a首先被转换为字符串，然后与" is number"连接，赋给var。 [code:1:6bd795b3ef]$ echo|awk '{a="1.234kilo";var=a+1;print var}' 2.234 [/code:1:6bd795b3ef] 数值语境，a先转换成1.234，然后参与计算。 这样下面的结果就容易理解了： [code:1:6bd795b3ef]$ echo|awk '{var= ;print var}'   [/code:1:6bd795b3ef] 由于没有引号，这里的语境首先是数字语境，awk先依次取得三个数字："1.2", ".3", 和".4"，但是三个数字之间没有任何操作符地并列在一起，awk就认为要进行字符串连接，三个数字被转换为字符串后连接了起来，即："1.2" "0.3" "0.4" ==>  。 再举几个例子: [code:1:6bd795b3ef]$  echo |awk '{var=1 2 3 4;print var}'  #equivlent to: "1" "2" "3" "4" 1234 $  echo |awk '{var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "" "3" "4" 1234 $ echo |awk '{a="abc";var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "abc" "3" "4" 12abc34 $ echo |awk '{a=2.5;var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "2.5" "3" "4" 122.534 $ echo|awk '{var=1 2 3 4 < 2 0 0 4;print var}'  #equivlent to: 1234 < 2004 , that is true 1 [/code:1:6bd795b3ef] 另外请注意下面print语句输出时两种不同写法的区别： [code:1:6bd795b3ef]$ echo "1 2"|awk '{print $1 $2;print $1,$2}' 12 1 2 [/code:1:6bd795b3ef] print $1 $2 ==> $1与$2连接后整体输出， print $1,$2 ==> $1与$2依次输出。 总之awk的数字和字符串类型转换相当灵活方便，字符串连接尤其容易迷惑人(confusing)，但是我们心里必须清楚我们要做什么，别把自己搞糊涂了！