LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1429|回复: 3

用awk怎样过滤该数据库?

[复制链接]
发表于 2003-5-6 16:07:49 | 显示全部楼层 |阅读模式
配置文件中得到含筛选表的变量select(即select的值为“aaa iuuyre”)
现对数库进行操作,将数据库中aaa、iuuyre对记录进行操作,如果其第二项为good则执行操作A,如果是bad则执行操作B。

数据库mydb结构如下:

A: aaa
B: good
C: ccc

A: aeela
B: bbdnfb
C: cccng
D: dddd
E:87wieuw

A: iuuyre
B: bad
C: dfdf
D: dfdkfjd
......

我的解法如下:
  1. for i in $syslist; do
  2.     i="A: "$i
  3.     #awk -F"\n" ??? '/$1/{ print $2 }' mydb
  4.    awk -f check.awk mydb
  5. done
复制代码


check.awk文件内容如下:
  1. BEGIN{
  2.     FS="\n"    #设置换行符为字段分隔符
  3.     RS=""      #设置空行为记录分隔符
  4. }

  5. { /$i/print "$2" }    #在此$i其实上是非法的
  6. ......
复制代码


其实我并不想写一个单独的check.awk,因为过程很简单。但我不知怎样在命令行中实现内置变量RS的赋值:awk -F"\n" ??? '/$1/{ print $2 }' mydb

采用单独脚本的方法也有问题,如何将做为筛选标准的变量$i传递到check.awk中?
 楼主| 发表于 2003-5-7 16:08:49 | 显示全部楼层
嘿嘿,awk果然有自己的一手。只是这个在man中写得也太含糊了。(当然也可能我英文太臭:p)
awk脚本是怎样与调用它的shell脚本进行变量通讯能?就是这个“-v var=value :assigns value to program variable var.” 其中var将被传递到awk脚本中,而value是shll中的变量值(注意,可一次传递多个变量),所以上面问题的解决方案就是:
  1. for i in $syslist; do
  2.     i="A: "$i
  3.    awk -f check.awk -v i="$i" mydb
  4. done
复制代码

check.awk文件内容为:
  1. BEGIN{
  2.     FS="\n"    #设置换行符为字段分隔符
  3.     RS=""      #设置空行为记录分隔符
  4. }

  5. { if ( $1 == i ) print $2 }  #在此i其实上是从shell脚本中的select变量传进来的
  6. ......
复制代码
发表于 2003-5-7 19:02:36 | 显示全部楼层
LYOO果然厉害,;), 真正把AWK玩透的高手也不多,AWK是一种专门对数据,报表处理的编程语言!在shell编程中,真正用到AWK的地方不是很多,要学的东西太多啦~~~
 楼主| 发表于 2003-5-7 19:45:36 | 显示全部楼层
javalee所言不错,awk的能力不可小视。我也正在考虑你的建议,把check.awk写强大一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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