免费注册 查看新帖 |

Chinaunix

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

awk与shell混合编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-24 09:46 |只看该作者 |倒序浏览
1.在awk读取shell的变量问题
  例如shell中有一个变量 PARA,按awk访问shell变量,应该是变更用单括号括起,即
  awk {print '$PARA'}
   但是我运行结果如下:
awk {print '$PARA'}
syntax error The source line is 1.
The error context is
                 >>>  <<<
awk: The statement cannot be correctly parsed.
The source line is 1.
   
2.在awk中调用shell里面的函数
  写了一个check_status的函数,有三个入参,于是在awk中取得三个变量后,执行该函数
awk 'BEGIN {FS="|"; while(getline< "mypara.lis" >0) {check_status $1 $2 $3 }}'
没有报错,但是也没有执行函数check_status

上述均运行于Compaq Tru64 Unix下面

论坛徽章:
0
2 [报告]
发表于 2007-01-24 10:07 |只看该作者
第一个问题 论坛里面讨论过 可以搜索一下
第二个问题 不知道这样调用行不行

论坛徽章:
0
3 [报告]
发表于 2007-01-24 10:32 |只看该作者
我把函数check_status要用到的参数放在配置文件,用|作为分隔符分开,有多行这样的函数
觉得用awk把每行参数读出来,再分割是最简单的处理方式,如果shell中的awk不能调用shell
的其它函数,那么,有没有其它比较好的方式实现我取参数的需求?

我也想过用sed取一行,用awk分割三次,一次取一个参数,用para1=`awk FS="|" '{print $1}'`
的做法,一来复杂,二来麻烦

论坛徽章:
0
4 [报告]
发表于 2007-01-24 10:32 |只看该作者
1.
  1. awk '{print '$PARA'}'
复制代码

2.哪本书介绍的可以“在awk中调用shell里面的函数”?shell的函数是不能被子进程继承的,而awk会启动一个子进程来执行自己。

论坛徽章:
0
5 [报告]
发表于 2007-01-24 10:40 |只看该作者
原帖由 janson1999 于 2007-1-24 10:32 发表
我把函数check_status要用到的参数放在配置文件,用|作为分隔符分开,有多行这样的函数
觉得用awk把每行参数读出来,再分割是最简单的处理方式,如果shell中的awk不能调用shell
的其它函数,那么,有没有其它比 ...
  1. $function a(){ echo $1$1; echo $2; echo "$3 $3"; }
  2. $cat file
  3. 1|2|3
  4. $a $(tr '|' ' ' <file)
  5. 11
  6. 2
  7. 3 3
复制代码

[ 本帖最后由 一梦如是 于 2007-1-24 10:45 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-01-24 11:04 |只看该作者
原帖由 一梦如是 于 2007-1-24 10:40 发表

  1. $function a(){ echo $1$1; echo $2; echo "$3 $3"; }
  2. $cat file
  3. 1|2|3
  4. $a $(tr '|' ' ' <file)
  5. 11
  6. 2
  7. 3 3
复制代码



谢谢指点,我的file可能是
1|2|3 3 3 3
4|5|6
7|8|9
1. 如果参数本身就有空格,如 3 3 3 3,这样就读不到完整的数据,只读到一个3,就是为什么我不用for i in `cat file`这样去处理
2.需要自己做循环每行去读取, 是否要先 wc -l算一下循环次数,再用sed顺序读一行出来处理?有没有更好的方法?

[ 本帖最后由 janson1999 于 2007-1-24 11:06 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-01-24 11:42 |只看该作者
awk传递参数应该如下:
awk '{print '$param'}'
注意不是awk '{print $param}'

[ 本帖最后由 Iambitious 于 2007-1-24 11:48 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-01-24 13:12 |只看该作者
  1. #!/bin/bash
  2. a(){
  3.         echo $1$1
  4.         echo $2
  5.         echo "$3 $3"
  6. }
  7. tr '|' ' ' <file | while read i
  8. do
  9.         a $i
  10. done
复制代码

论坛徽章:
0
9 [报告]
发表于 2007-01-24 13:14 |只看该作者
原帖由 一梦如是 于 2007-1-24 13:12 发表
  1. #!/bin/bash
  2. a(){
  3.         echo $1$1
  4.         echo $2
  5.         echo "$3 $3"
  6. }
  7. tr '|' ' ' <file | while read i
  8. do
  9.         a $i
  10. done
复制代码


像这样的配置:
1|2|3 3 3 3
4|5 5 5 5|6
--如果参数本身就有空格,如 3 3 3 3,这样就读不到完整的数据,只读到一个3,就是为什么我不用for i in `cat file`这样去处理

论坛徽章:
0
10 [报告]
发表于 2007-01-24 13:17 |只看该作者
为什么不先试验下我写的?
用file
  1. 1|2 3
  2. 4 5|6
复制代码

[ 本帖最后由 一梦如是 于 2007-1-24 13:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP