【问题标题】:integer variable in awk scriptawk 脚本中的整数变量
【发布时间】:2014-09-26 23:14:04
【问题描述】:

我在shell脚本中有以下代码:首先计算列数(变量numCol),然后将其插入awk中的for循环以检查每行中的所有值是否全为0:

numCol=$(awk '{print NF}' $line | head -n 1)$
awk '{for (i=1; i<=$numCol; ++i) if($i != 0) {print;next}}' $line$

但是,我收到了这个错误:awk: illegal field $(), name "numCol"

【问题讨论】:

  • 您得到了答案,但 shell 脚本没有意义。假设 $line 包含从脚本中显示的输入文件的名称,您需要在 awk 中打印包含零或空格以外的其他内容的行。
  • @ed,好主意,但要迂腐,还有其他“零”值:printf "%s\n" 0 0.0 0e0 0e-1 | awk '$1 != 0'
  • @glennjackman 也是一个好点。他没有说all equal to zero,但他说all 0s,所以我认为我的建议会奏效。一些示例输入和预期输出肯定会告诉我们。
  • 我同意。有时我会挑毛病。只要问我的妻子......
  • 每行末尾的$ 令人费解;我认为他们不应该在场。

标签: shell awk


【解决方案1】:

要将$numCol shell 变量传递给awk,请使用-v 选项:

awk -v numCol=$numCol '{for (i=1; i<=numCol; ++i) if($i != 0) {print;next}}'

但是,如果您显示一些示例输入/输出数据,那么我们也许可以一步完成。

【讨论】:

    【解决方案2】:

    你弄乱了 shell 的变量和 awk 的变量

    这个例子说明了一切:

    awk -v awkVar="$shellVar" '{for(i=1;i<=awkVar;i++)...}' ...
    

    名称可能不同,但您应该知道应该在哪种上下文中使用哪个变量。

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 2023-03-30
      • 2012-08-12
      • 1970-01-01
      • 2014-08-19
      • 2017-08-25
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多