仅在添加for循环时awk中的语法错误

时间:2014-03-03 15:44:10

标签: bash shell syntax awk

这是我的剧本:

for i in *.locs 

do

awk -v start=$(head -n 1 ${i}) -v end=$(tail -n 1 ${i})

BEGIN {

    sum = 0;
    count = 0;
    range_start = -1;
    range_end = -1;
}
{
    irow = int($1)
    ival = $2 + 0.0
    if (irow >= start && end >= irow) {
            if (range_start == -1) {
                range_start = NR;
            }
            sum = sum + ival;
            count++;
        }
    else if (irow > end) {
            if (range_end == -1) {
                range_end = NR - 1;
            }
        }
}
END {

    echo "${i}"
    print "start =", range_start, "end =", range_end, "mean =", sum / count
}

done

这给了我这个错误:

第15行:意外令牌附近的语法错误`}'

第15行:'}'

但是当我第一次使用awk生成变量start和end后跟-f myscript.sh文件

我没有收到错误:

我错过了什么?

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要引用整个awk脚本,或者转义美元符号,以便shell在调用awk之前不会将它们展开为位置参数。 (添加单引号会解决另一个问题,即没有行继续符,awk命令本身在行尾结束,脚本的其余部分被解析为不正确bash代码):

awk -v start=$(head -n 1 ${i}) -v end=$(tail -n 1 ${i}) '

BEGIN {
...
'

答案 1 :(得分:0)

awk程序中的字符由shell解释。您可以将程序作为命令行参数传递给awk,但必须将其括在“单引号”中以防止shell解释它。