免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: onlyabug
打印 上一主题 下一主题

awk里面为什么自动加了0  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-03-25 17:37 |只看该作者

awk里面为什么自动加了0

试试这个:

awk '{if($1=="1.2.3.4" {print $0}}' infile_name

论坛徽章:
0
12 [报告]
发表于 2004-03-25 17:46 |只看该作者

awk里面为什么自动加了0

原帖由 "大红机器" 发表:

结果对了是碰巧,因为你所有行都是1.2.3.4,一个'='号在awk里作用不是判断,而是赋值,不信你随便改一行别的试试,显示结果还是全是1.2.3.4
不用试,在awk里,=表示赋值,==表示条件

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2004-03-25 17:49 |只看该作者

awk里面为什么自动加了0

原帖由 "john_student" 发表:
喜欢用"~"的还要注意:
.  -->  \.


谢谢提醒!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
14 [报告]
发表于 2004-03-26 11:03 |只看该作者

awk里面为什么自动加了0

很久不来,看到这么有趣的话题,忍不住要说上两句,不对的地方大家指正!
引自大红机器:
解释:
由于写成了$1=1.2.3.4,所以awk认为$0,在本例里也就是$1的值为1.2.3.4,而1.2.3.4不是一个数字,awk再进一步解释为1.2和0.3和0.4,显示结果还不以空格分开,所以显示1.20.30.4
应该是这样吧。


说的完全正确!

我们知道,首先,与c/c++,java等相比,awk是一种弱类型语言。你不需要提前声明就可以使用变量,变量的类型转换也是隐含的,在某一语境(上下文)下它可能用作数字,在另一语境下它可能就用作字符串。

另外一个需要小心的地方就是awk的字符串连结操作,这个操作没有任何操作符,只要把需要连结的串并列写在一起就可以了。
  1. $ echo|awk '{a=1.234;var=a" is a number";print var}'
  2. 1.234 is a number
复制代码


这里a首先被转换为字符串,然后与" is number"连接,赋给var。

  1. $ echo|awk '{a="1.234kilo";var=a+1;print var}'
  2. 2.234
复制代码

数值语境,a先转换成1.234,然后参与计算。

这样下面的结果就容易理解了:
  1. $ echo|awk '{var=1.2.3.4;print var}'
  2. 1.20.30.4
复制代码

由于没有引号,这里的语境首先是数字语境,awk先依次取得三个数字:"1.2", ".3", 和".4",但是三个数字之间没有任何操作符地并列在一起,awk就认为要进行字符串连接,三个数字被转换为字符串后连接了起来,即:"1.2" "0.3" "0.4" ==> 1.20.30.4。

再举几个例子:
  1. $  echo |awk '{var=1 2 3 4;print var}'  #equivlent to: "1" "2" "3" "4"
  2. 1234

  3. $  echo |awk '{var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "" "3" "4"
  4. 1234

  5. $ echo |awk '{a="abc";var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "abc" "3" "4"
  6. 12abc34

  7. $ echo |awk '{a=2.5;var=1 2 a 3 4;print var}'  #equivlent to: "1" "2" "2.5" "3" "4"
  8. 122.534

  9. $ echo|awk '{var=1 2 3 4 < 2 0 0 4;print var}'  #equivlent to: 1234 < 2004 , that is true
  10. 1
复制代码


另外请注意下面print语句输出时两种不同写法的区别:
  1. $ echo "1 2"|awk '{print $1 $2;print $1,$2}'
  2. 12
  3. 1 2
复制代码

print $1 $2 ==> $1与$2连接后整体输出,
print $1,$2 ==> $1与$2依次输出。

总之awk的数字和字符串类型转换相当灵活方便,字符串连接尤其容易迷惑人(confusing),但是我们心里必须清楚我们要做什么,别把自己搞糊涂了!

论坛徽章:
0
15 [报告]
发表于 2004-03-26 11:11 |只看该作者

awk里面为什么自动加了0

说的好呀,
请再解释一下http://bbs.chinaunix.net/forum/24/20040325/288603.html
中()的意思。

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-10-11 06:20:00数据库技术版块每日发帖之星
日期:2015-10-12 06:20:00数据库技术版块每日发帖之星
日期:2015-10-15 06:20:00数据库技术版块每日发帖之星
日期:2015-10-30 06:20:00综合交流区版块每月发帖之星
日期:2015-12-02 14:59:01数据库技术版块每日发帖之星
日期:2015-12-15 06:20:00
16 [报告]
发表于 2006-07-22 11:13 |只看该作者
受益非浅 ^_^

论坛徽章:
0
17 [报告]
发表于 2006-07-23 11:02 |只看该作者
原帖由 大红机器 于 2004-3-25 16:33 发表
解释:
由于写成了$1=1.2.3.4,所以awk认为$0,在本例里也就是$1的值为1.2.3.4,而1.2.3.4不是一个数字,awk再进一步解释为1.2和0.3和0.4,显示结果还不以空格分开,所以显示1.20.30.4
应该 ...

有道理!

论坛徽章:
0
18 [报告]
发表于 2006-07-23 11:36 |只看该作者
绝对精彩,!

论坛徽章:
0
19 [报告]
发表于 2006-07-24 15:57 |只看该作者
我也补充点东西,和大家分享!注意双引号的用法!

  1. echo|awk 'BEGIN {a=1.234;var=" is a number";}
  2. {b=avar;print "b=[avar],res=["b"]"}
  3. {b=a var;print "b=[a var],res=["b"]"}
  4. {b="a var";print "b=[\"a var\"],res=["b"]"}
  5. {b="a" var;print "b=[\"a\" var],res=["b"]"}
  6. {b=""a" var";print "b=[\"\"a\" var\"],res=["b"]"}'
  7. #{b='a var';print "b=[a var],res=["b"]"}'
复制代码

运行结果:
  1. b=[avar],res=[]
  2. b=[a var],res=[1.234 is a number]
  3. b=["a var"],res=[a var]
  4. b=["a" var],res=[a is a number]
  5. b=[""a" var"],res=[1.234 var]
复制代码

[ 本帖最后由 ruifox 于 2006-7-24 16:38 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2006-09-28 09:21 |只看该作者

回复 14楼 woodie 的帖子

受教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP