【问题标题】:Syntax error in awk only when adding a for loop仅在添加 for 循环时 awk 中的语法错误
【发布时间】:2014-04-04 18:03:25
【问题描述】:

这是我的脚本:

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 文件时

我没有收到错误:

我错过了什么?

提前致谢

【问题讨论】:

  • 你上一个问题的cyon replied 是一个awk 脚本,例如,你必须单独存储为script.awk,并使用awk ... -f script.awk 调用。
  • 但是因为我有这么多文件并且想在打印结果之前添加那个 echo "${i}" 这样我就可以知道每个文件的结果
  • awk 不是shellecho "${i}"shell 命令。你不能从awk 调用echo,就像你不能从C 调用它一样,等等。不清楚你要做什么,这可能意味着你的方法是错误的——如果你告诉我们你'正在尝试做并发布一些小样本输入和预期输出,我们可以提供帮助。
  • 感谢 Ed Morton。这是以前的帖子,我得到了这个脚本 (stackoverflow.com/questions/22145261/…),所以你可以看到我的问题。

标签: bash shell syntax awk


【解决方案1】:

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

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

BEGIN {
...
'

【讨论】:

  • 我添加了逗号,但仍然出现错误。我把第二个逗号放在完成之前的行中
  • @JM88 这些不是逗号,它们是单引号字符。
  • 是的,对不起,我的意思是单引号。当我使用单引号时出现错误。
  • @JM88 我的水晶球说它可能与 END 部分中的 echo "${i}" shell 命令有关。你真的需要更新你的问题,告诉我们你想要做什么,这样我们就可以帮助你做正确的事情。
  • 我创建了这个新帖子,再次解释它。我希望你现在能理解我的问题。提前致谢。 stackoverflow.com/questions/22152486/adding-a-loop-in-awk
【解决方案2】:

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

【讨论】:

  • 我需要在哪里加上引号?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多