免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3844 | 回复: 7
打印 上一主题 下一主题

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-17 10:34 |只看该作者 |倒序浏览
没查到资料,前辈们指点一下。

论坛徽章:
0
2 [报告]
发表于 2003-11-17 10:44 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

shell 中有  macro expansion 吗?
还是说 variable expansion ?

论坛徽章:
0
3 [报告]
发表于 2003-11-17 10:46 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

如在SHELL中这样:

# a=b

# $a=1

# echo $b

1

awk中行不行

论坛徽章:
0
4 [报告]
发表于 2003-11-17 10:56 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

awk 好像真的没有这种功能。

但是,这种功能,是变量替换的一种特殊形式,
简单的 shell 很有用,类似 macro

macro 既是魔鬼又是天使
慎用,有害身体

shell 中的 macro 替换只是一级,还易懂,
而且有限制,不是真正的 macro , 危害不大。

你的问题不用 macro 一定也有其他的解决方案

论坛徽章:
0
5 [报告]
发表于 2003-11-17 11:31 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

不是我的问题,看这个贴子。

http://www.chinaunix.net/forum/viewtopic.php?t=203271

你用awk 会怎么做?

论坛徽章:
0
6 [报告]
发表于 2003-11-17 13:27 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?


  1. %cat m
  2. 11111|abcdef
  3. 22222|abcd
  4. 33333|asdff
  5. 11111|kkkk
  6. 44444|asdfe
  7. 11111|weff
  8. 55555|wefff
  9. 66666|asfew
  10. 22222|sdfef
  11. 77777|wsfefe
  12. 88888|wsfefd
  13. 99999|sdfedf
  14. 33333|sadfsdf
  15. 77777|sdfewf
  16. #!/bin/awk -f
  17. BEGIN {FS="|"}

  18. { if ($1 in c){
  19.         if (c[$1]==0){
  20.             d[$1] = d[$1] "\n"  $0
  21.         }else{
  22.             d[$1] = c[$1] "\n" $0
  23.         }
  24.         c[$1] = 0
  25.   }else{
  26.         c[$1]= $0
  27.   }
  28. }
  29. END { for( x in c) {
  30.         if (c[x]==0){
  31.            print d[x] >"/dev/stdout"
  32.         }else{
  33.            print c[x] >"/dev/stderr"
  34.         }
  35.     }
  36. }
  37. %cat m | ./b.awk 2>m1 1>m2
  38. %cat m1
  39. 44444|asdfe
  40. 55555|wefff
  41. 88888|wsfefd
  42. 99999|sdfedf
  43. 66666|asfew
  44. %cat m2
  45. 11111|abcdef
  46. 11111|kkkk
  47. 11111|weff
  48. 22222|abcd
  49. 22222|sdfef
  50. 33333|asdff
  51. 33333|sadfsdf
  52. 77777|wsfefe
  53. 77777|sdfewf
复制代码


尽管实现了要求,但是我觉得逻辑过于复杂。


  1. %sort -t \| -f 0 -n m | uniq --repeated
  2. 44444|asdfe
  3. 55555|wefff
  4. 66666|asfew
  5. 88888|wsfefd
  6. 99999|sdfedf
  7. %sort -t \| -f 0 -n m | uniq -u
  8. 11111|abcdef
  9. 11111|kkkk
  10. 11111|weff
  11. 22222|abcd
  12. 22222|sdfef
  13. 33333|asdff
  14. 33333|sadfsdf
  15. 77777|sdfewf
  16. 77777|wsfefe
复制代码

就可以了。

那个工具方便就用那个, 解决这个问题还是 uniq sort 好用。

论坛徽章:
0
7 [报告]
发表于 2003-11-17 15:07 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

我也感觉用SHELL好,可是想不到你写得这么简单,厉害!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-11-17 21:58 |只看该作者

awk 中的非字段变量能不能象 SHELL 一样使用宏替换?

原帖由 "CharlesWang2" 发表:
就可以了。

那个工具方便就用那个, 解决这个问题还是 uniq sort 好用。


真棒!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP