awk里的类型与字符串连接 by woodie
01 January 2006
本文为woodie在帖子 awk里面为什么自动加了0 里的发言
背景
网友onlyabug预期下面的代码输出结果为"1.2.3.4",但实际结果却是"1.20.30.4", 于是提出问题。
echo | awk '{var=1.2.3.4;print var}'
woodie的回答
我们知道,首先,与c/c++,java等相比,awk是一种弱类型语言。你不需要提前声明就可 以使用变量,变量的类型转换也是隐含的,在某一语境(上下文)下它可能用作数字,在另 一语境下它可能就用作字符串。
另外一个需要小心的地方就是awk的字符串连结操作,这个操作没有任何操作符,只要把 需要连结的串并列写在一起就可以了。
$ echo | awk '{a=1.234;var=a" is a number";print var}' 1.234 is a number
这里a首先被转换为字符串,然后与" is number"连接,赋给var。
$ echo | awk '{a="1.234kilo";var=a+1;print var}' 2.234
数值语境,a先转换成1.234,然后参与计算。
这样下面的结果就容易理解了:
$ echo | awk '{var=1.2.3.4;print var}' 1.20.30.4
由于没有引号,这里的语境首先是数字语境,awk先依次取得三个数字:"1.2", ".3", 和 ".4",但是三个数字之间没有任何操作符地并列在一起,awk就认为要进行字符串连接, 三个数字被转换为字符串后连接了起来,即:"1.2" "0.3" "0.4" ==> 1.20.30.4。
再举几个例子:
$ 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
另外请注意下面print语句输出时两种不同写法的区别:
$ echo "1 2" | awk '{print $1 $2;print $1,$2}' 12 1 2
- print $1 $2 ==> $1与$2连接后整体输出,
- print $1,$2 ==> $1与$2依次输出。
总之awk的数字和字符串类型转换相当灵活方便,字符串连接尤其容易迷惑人(confusing), 但是我们心里必须清楚我们要做什么,别把自己搞糊涂了!
blog comments powered by Disqus