Chinaunix

标题: 使用awk -f a.awk 方式 取得a.awk返回值问题!!求助 [打印本页]

作者: yangfbi008    时间: 2010-02-05 14:28
标题: 使用awk -f a.awk 方式 取得a.awk返回值问题!!求助
根据
eval $(echo 1231koko12|awk '{j=match($1,"ko");{print "a="j}} ')

echo $a

5

我了解到通过eval  可以得到awk的返回值

可是我现在用 awk -f  a.awk $file 结合eval 却不行

请问 awk -f  a.awk $file 这种方式怎么在shell取得返回值
作者: blackold    时间: 2010-02-05 14:41
今天怎么了?都是这种看不懂的贴子。
作者: iori809    时间: 2010-02-05 14:44
#awkfile
{
    print match($0,"ko")
}

=====================
#file
1231koko12
================


#shellscript
#!/bin/bash
var=`awk -f awkfile  file`
echo "$var"



不知道是否是你要想要的》?
作者: yangfbi008    时间: 2010-02-05 14:48
我现在这么写的
eval  $( awk -v path=$filepath  -f  a.awk $file  )


报错 说 ( 附近语法错误

我想把 a.awk 中执行的个别数据返回到shell 继续判读
作者: nigelrax    时间: 2010-02-05 14:54
我明白楼主意思了 等我重启虚拟机啊 呵呵
作者: nigelrax    时间: 2010-02-05 15:05
cat a.awk
#!/bin/awk -f

{j=match($1,"ko");print j}
——————————————
a=`awk -f a.awk urfile`
echo $a
作者: iori809    时间: 2010-02-05 15:12
最好不要使用 $()这种形式 用``最好,我们写的那个应该能实现你的需求啊。 非要用那种方法写吗?
作者: yangfbi008    时间: 2010-02-05 15:13
回复 6# nigelrax


    在a.awk文件中会有很多print出很多数据到终端
  而我只想取得两个项目的值 并且我不想打出这两个项目
作者: yangfbi008    时间: 2010-02-05 15:15
回复 7# iori809


   
你们的写法会把所有数据都取出来  
但我只想要 两个数据  其他数据则需要打到终端
作者: iori809    时间: 2010-02-05 15:23
你的意思加入AWK输出3个数据,然后你只想输出两个吗? 给个具体数据看看 吧
作者: yangfbi008    时间: 2010-02-05 15:34
本帖最后由 yangfbi008 于 2010-02-05 15:38 编辑

比如说
a.awk

BEGIN{
x = 0;
y= 0;

}
{


for (i = 1; i <=NF; i++)
{

print "line " i;


}

x = 1;
y = 1;
}
END
{
   ###  我想把  x  和 y的值返回到shell里

}


a.sh

eval $( awk -f a.awk $file)
执行这句话后 取得x 和 y的值


是这样的意思
作者: nigelrax    时间: 2010-02-05 15:40
我用eval $(...)没问题 测试可以得到a的值
作者: yangfbi008    时间: 2010-02-05 15:45
回复 12# nigelrax


    把证据贴出来

我这怎么报错
作者: nigelrax    时间: 2010-02-05 15:47
你报的错贴上来
作者: yangfbi008    时间: 2010-02-05 15:51
我得自己打  我用的另一台机器测试

a.sh : eval: line 20 : syntax error near unexpected token `('
作者: yangfbi008    时间: 2010-02-05 15:54
你把执行的关键几步也帮我贴出来把
作者: nigelrax    时间: 2010-02-05 15:54
你最好上那台机子 把你的原始代码贴出来

包括a.sh和a.awk两个文件

因为你举的例子和你的原始文件不同 eval所处理的命令也不同

我的

cat a.awk
#!/bin/awk -f

{j=match($1,"ko");print "a="j}

cat word
jskdffkosf

eval $(awk -f a.awk word)

echo $a
7
作者: yangfbi008    时间: 2010-02-05 16:03
回复 17# nigelrax


    我试了下你的  
还真有
太感谢了
等我研究研究
作者: justlooks    时间: 2010-02-05 16:14
#cat aa
#!/bin/awk -f

{
  j=match($1,"ko")
  print "a="j
}

#!/bin/bash

eval `echo "aa"|awk -f aa`
echo $a

# bash bb
0
作者: yangfbi008    时间: 2010-02-05 16:55
回复 17# nigelrax


    我发现个奇怪的事
你们那种确实没问题

b.sh
eval `awk -f a.awk test.c`
echo $aaa


a.awk

#!/bin/awk -f

BEGIN {
        x = 1;
        n = 0;
        comS = 0;
        sunlines = 0;
        sehv = 0;
        pathout = 0;
}

{
       
        if ($1 == "/*" && $2 == "<s>")
        {
                n = 0;
                if ( pathout == 0 )
                {
                        print path;
                        pathout = 1;
                }

                printf(" 123213");
                sehv = 1;
               
                x = NR;               
        }
       
print "aaa="12345;
       
}

END {
       
        if (sehv == 1)
        {
                        #print "effective lines: " sunlines;
        }
}

就这个代码我试了下
发现只要有除了aaa以外其他的print或者printf就会报错  
而且错误都很难理解
现在这个代码的执行结果是
b.sh: line 3: 123213aaa=12345: command not found


如果把这句话 print "effective lines: " sunlines; 的注释取消的并且把printf(" 123213");注视的话  
报错是 b.sh: line 3: effective: command not found

所以非常奇怪 很不理解
作者: justlooks    时间: 2010-02-05 17:04
很好理解啊,你在命令行执行123213aaa=12345就提示找不到这个命令啊
作者: yangfbi008    时间: 2010-02-05 17:15
给点解决办法

我需要输出其他信息打到屏幕上
作者: nigelrax    时间: 2010-02-05 17:48
eval $(...)是将括号内命令的输出作为shell命令去执行 你print一个effective lines ,shell就会认为effective是一个系统命令 lines是其参数 所以当然会报错 command not found




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2