LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: litty

awk脚本中大括号的作用是什么?[已解决]

[复制链接]
发表于 2004-4-15 18:40:07 | 显示全部楼层
最初由 r2007 发表
教主需要再温习一下awk了.
  1. r2007@www c $ cat a
  2. Mike Harrington:(510)548-1278:250:100:175
  3. Christian Dalsass:(408)538-2358:155:90:201
  4. Susan Dalsass:(206)654-6279:250:60:50
  5. r2007@www c $ awk -F: 1 a                                                      
  6. Mike Harrington:(510)548-1278:250:100:175
  7. Christian Dalsass:(408)538-2358:155:90:201
  8. Susan Dalsass:(206)654-6279:250:60:50
复制代码

恐怕还不需要,呵呵。

注意,我补充一下我的话,"扩域"(这里就是增加了$6)后,awk会打印$1~$n而非$0,其余情况打印$0。实事求是嘛。

  1. [root@home root]# awk -F : '{print $0}$6=$2+$3+$5;' littydata
  2. Mike Harrington:(510)548-1278:250:100:175
  3. Mike Harrington (510)548-1278 250 100 175 425
  4. Christian Dalsass:(408)538-2358:155:90:201
  5. Christian Dalsass (408)538-2358 155 90 201 356
  6. Susan Dalsass:(206)654-6279:250:60:50
  7. Susan Dalsass (206)654-6279 250 60 50 300
  8. [root@home root]# awk -F : '{print $0}$5~/^[0-9]*$/' littydata
  9. Mike Harrington:(510)548-1278:250:100:175
  10. Mike Harrington:(510)548-1278:250:100:175
  11. Christian Dalsass:(408)538-2358:155:90:201
  12. Christian Dalsass:(408)538-2358:155:90:201
  13. Susan Dalsass:(206)654-6279:250:60:50
  14. Susan Dalsass:(206)654-6279:250:60:50
  15. [root@home root]# awk -F : '{print $0}1' littydata
  16. Mike Harrington:(510)548-1278:250:100:175
  17. Mike Harrington:(510)548-1278:250:100:175
  18. Christian Dalsass:(408)538-2358:155:90:201
  19. Christian Dalsass:(408)538-2358:155:90:201
  20. Susan Dalsass:(206)654-6279:250:60:50
  21. Susan Dalsass:(206)654-6279:250:60:50
复制代码
发表于 2004-4-15 18:44:38 | 显示全部楼层
最初由 r2007 发表
gnu awk的缺省action是print,即print $0.
其它awk通常也是print $0,请核实.
至于$0的格式不同是另外的问题.

awk的默认的打印只有是$0,除非你另有指定

  1. awk -F: 'BEGIN{OFS=":"}$6=$3+$4+$5' filename
复制代码

  1. /home/javalee#awk -F: 'BEGIN{OFS=":"}{print};$6=$3+$4+$5' data
  2. Mike Harrington:(510)548-1278:250:100:175
  3. Mike Harrington:(510)548-1278:250:100:175:525
  4. Christian Dalsass:(408)538-2358:155:90:201
  5. Christian Dalsass:(408)538-2358:155:90:201:446
  6. Susan Dalsass:(206)654-6279:250:60:50
  7. Susan Dalsass:(206)654-6279:250:60:50:360
复制代码
发表于 2004-4-15 19:13:13 | 显示全部楼层
最初由 home_king 发表
注意,我补充一下我的话,"扩域"(这里就是增加了$6)后,awk会打印$1~$n而非$0,其余情况打印$0

关于$0的问题,请看下面例子,注意1{print $0}始终和缺省action时的输出结果是一样的,不仅仅"扩域",很多情况$0会重新计算,在此仅举数例参考.所以缺省action是print $0,只不过某些动作会使$0重新计算,并不是想象中的"awk会打印$1~$n而非$0",缺省动作就是print $0.
以上是实战分析,另外还有许多awk资料可以佐证,目前我还没有从任何资料中遇到教主的这种解释.
请教主不要介意,我说的有点直了.

  1. r2007@www $ awk -F: '1;1{print $0};1{print $1,$2,$3,$4,$5}' a      
  2. Mike Harrington:(510)548-1278:250:100:175
  3. Mike Harrington:(510)548-1278:250:100:175
  4. Mike Harrington (510)548-1278 250 100 175
  5. Christian Dalsass:(408)538-2358:155:90:201
  6. Christian Dalsass:(408)538-2358:155:90:201
  7. Christian Dalsass (408)538-2358 155 90 201
  8. Susan Dalsass:(206)654-6279:250:60:50
  9. Susan Dalsass:(206)654-6279:250:60:50
  10. Susan Dalsass (206)654-6279 250 60 50
  11. r2007@www c $ awk -F: '{$6=11};1;1{print $0};1{print $1,$2,$3,$4,$5,$6}' a      
  12. Mike Harrington (510)548-1278 250 100 175 11
  13. Mike Harrington (510)548-1278 250 100 175 11
  14. Mike Harrington (510)548-1278 250 100 175 11
  15. Christian Dalsass (408)538-2358 155 90 201 11
  16. Christian Dalsass (408)538-2358 155 90 201 11
  17. Christian Dalsass (408)538-2358 155 90 201 11
  18. Susan Dalsass (206)654-6279 250 60 50 11
  19. Susan Dalsass (206)654-6279 250 60 50 11
  20. Susan Dalsass (206)654-6279 250 60 50 11
  21. r2007@www c $ awk -F: '{NF--};1;1{print $0};1{print $1,$2,$3,$4}' a            
  22. Mike Harrington (510)548-1278 250 100
  23. Mike Harrington (510)548-1278 250 100
  24. Mike Harrington (510)548-1278 250 100
  25. Christian Dalsass (408)538-2358 155 90
  26. Christian Dalsass (408)538-2358 155 90
  27. Christian Dalsass (408)538-2358 155 90
  28. Susan Dalsass (206)654-6279 250 60
  29. Susan Dalsass (206)654-6279 250 60
  30. Susan Dalsass (206)654-6279 250 60
  31. r2007@www c $ awk -F: '{$1=$1};1;1{print $0};1{print $1,$2,$3,$4,$5}' a         
  32. Mike Harrington (510)548-1278 250 100 175
  33. Mike Harrington (510)548-1278 250 100 175
  34. Mike Harrington (510)548-1278 250 100 175
  35. Christian Dalsass (408)538-2358 155 90 201
  36. Christian Dalsass (408)538-2358 155 90 201
  37. Christian Dalsass (408)538-2358 155 90 201
  38. Susan Dalsass (206)654-6279 250 60 50
  39. Susan Dalsass (206)654-6279 250 60 50
  40. Susan Dalsass (206)654-6279 250 60 50
  41. r2007@www c $
复制代码
 楼主| 发表于 2004-4-15 21:04:09 | 显示全部楼层
最初由 home_king 发表
呵呵,谢谢褒奖。
不过在下认为,从来就没有什么奇才,黑客的行为只能用两个词来解释:兴趣与方法
老生常谈一句,我建议新手应该去做lfs一次,把基本知识过一遍,触类旁通,那以后的学习之路就比较轻松了。这是在下的经验之谈,兄弟可以参考一下。



谢谢斑竹的指点。
可是小弟不知道什么叫lfs?
:confused:

sorry
发表于 2004-4-15 22:06:29 | 显示全部楼层
to r2007:
呵呵,其实没必要争论了,我要说明的与你一样,表达方式有别而已。
很多情况$0会重新计算,在此仅举数例参考.所以缺省action是print $0,只不过某些动作会使$0重新计算,并不是想象中的"awk会打印$1~$n而非$0",缺省动作就是print $0


to litty:
http://lfs.linuxsir.cn
发表于 2004-4-15 23:44:09 | 显示全部楼层
从上面的例子中看出,awk和sed对于input record的处理过程是一样的. 缺省就是那个input record, 即$0或1.但当这个input record读入到awk的buffer中去之后, awk对其的任何操作都将改变原来的input record或$0.比如增加一域什么的. 这样, $0就不再是$0了. 我个人认为javalee兄和r2007兄说的还是有道理的. 最重要最的是awk缺省的就是打印$0, 一旦$0编辑变了,就再也输出不了原来的$0了.不知我理解的对不对. 如果不对, 那么那怎样在编辑了$0之后,仍然再输出原来的$0呢?
发表于 2004-4-15 23:47:52 | 显示全部楼层
嗯,一般都是输出$0的,但"扩域"后的输出的确不同。

这点不要再争论了,一般不会遇到这类牛角尖的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表