LinuxSir.cn,穿越时空的Linuxsir!

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

awk引用变量的问题[已解决]

[复制链接]
发表于 2004-4-21 22:02:49 | 显示全部楼层 |阅读模式
#!/bin/ksh
set -A arg 1 2 3 4
echo ${arg[0]}
awk "{print ${arg[0]} + ${arg[1]}*$1}" test.dat

其中test.dat的内容为
1 3
2 4
3 5
2 4


我发现awk后面跟一对单引号''时,$1可以起作用,但是${arg[0]}不起作用,如果用双引号""时,就刚好反过来。搞了半天不知道怎么做了,请高手们帮帮忙
发表于 2004-4-21 22:45:15 | 显示全部楼层

回复: awk引用变量的问题

最初由 scopio 发表
#!/bin/ksh
set -A arg 1 2 3 4
echo ${arg[0]}
awk "{print ${arg[0]} + ${arg[1]}*$1}" test.dat

其中test.dat的内容为
1 3
2 4
3 5
2 4


我发现awk后面跟一对单引号''时,$1可以起作用,但是${arg[0]}不起作用,如果用双引号""时,就刚好反过来。搞了半天不知道怎么做了,请高手们帮帮忙

请先参阅bash的命令行处理,ksh有类似的处理过程。
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=99465
为了避免$1被bash解析为位置参数,加上了单引号来跳过bash的前十步处理。

awk引用外部变量的六种方法:
1. awk -v awkvar=$extvar ... #使变量的作用域扩展至BEGIN{}
2. awk '<awk expression>' "awkvar=$extvar" filename #BEGIN段不可用
3. 在awk表达式中使用'$extvar'
4. 模式引用(在正则表达式中引用外部变量) '"$extvar"'
5. 遍历外部数组(用于BEGIN段处理) awk -f 'BEGIN{for(i=1;i<ARGC;i++)print ARGV}' ${extarr[@]}
6. 引用环境变量 ENVIRON["environment variable"]
发表于 2004-4-21 23:40:39 | 显示全部楼层
  1. #!/bin/ksh
  2. set -A arg 1 2 3 4
  3. echo ${arg[0]}
  4. awk '{print '${arg[0]}' + '${arg[1]}'*$1}' test.dat
复制代码

home_king兄的解释,我没什么补充的 ;)
ps:不要被书本的东西搞混头脑,自己多动手实践实际,养成习惯了,自然就可淋漓尽致的发挥了~~~
 楼主| 发表于 2004-4-22 10:23:02 | 显示全部楼层
谢谢两位,从你们身上可以学到很多东西

不过我自己没有书,我是看你们的脚本在学习,呵呵

set -A arg 1 2 3 4

是我从Javalee的一个脚本里看到的,我发现sh里没有用,不知道对应的sh里面是什么样实现的,谢谢
发表于 2004-4-22 11:11:05 | 显示全部楼层
最初由 scopio 发表
谢谢两位,从你们身上可以学到很多东西

不过我自己没有书,我是看你们的脚本在学习,呵呵

set -A arg 1 2 3 4

是我从Javalee的一个脚本里看到的,我发现sh里没有用,不知道对应的sh里面是什么样实现的,谢谢

这是ksh创建数组的方法,与之类似,bash是这样:
art=(1 2 3 4)
而对数组元素的引用都是一样的
 楼主| 发表于 2004-4-22 17:28:14 | 显示全部楼层
谢谢:)
发表于 2004-4-26 01:46:49 | 显示全部楼层
给出了模式引用外部变量以及索引外部数组的方法,请重温楼上帖子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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