【问题标题】:Why using variable in awk printf doesn't work?为什么在 awk printf 中使用变量不起作用?
【发布时间】:2013-04-05 17:43:40
【问题描述】:

这里是新手。我正在尝试使用 awk 打印一些信息。于是我写了一个shell脚本

#!/bin/bash

turbVar="U"
bcName="outlet"
str="$turbVar $bcName b.c. = "
# method-1
awk -v RS='}' '/'$bcName'/ { printf "%20s = %s\n" $str $4; exit;}' BCFile  | tr -d ";"
# method-2
awk -v RS='}' -v var1=$bcName '$0 ~ var1 { printf "%20s = %s\n" $str $4; exit;}' BCFile  | tr -d ";"

BCFile 文件内容是

boundary
{
    inlet
    {
        type            fixedValue;
        value           uniform (5 0 0);
    }

    outlet
    {
        type            inletOutlet;
        inletValue      $internalField;
        value           $internalField;
    }

    ....
} 

我希望输出类似的东西

U outlet b.c. = inletOutlet

很遗憾,这不起作用。它抱怨awk: (FILENAME=0/U FNR=4) fatal: not enough arguments to satisfy format string %20s = %s

为什么我不能在 awk printf 中使用 $str 变量?

第二个问题,哪种方法更好?使用'/'$bcName'/或者-v var1=$bcName '$0 ~ var1?,为什么我不能直接使用'/$bcName/或者'/"$bcName"/?这里的强引用和弱引用有什么区别?

【问题讨论】:

  • 0/U 应该是什么?
  • 这是一个文件。它的内容显示在这篇帖子http://stackoverflow.com/questions/15825150/how-to-find-the-multiline-pattern-match-they-must-be-first-time-match
  • 文件U 位于名为0 的文件夹中。 :)
  • @sudo_O - 仅供参考,您不能命名包含正斜杠的文件。 nul 字符“\0”也是如此。
  • @Daniel - 写下您对What is the difference between strong quote and weak quote 的问题。您认为“强”与“弱”引用是什么?我们通常只谈论单引号和双引号。就您的脚本而言,不要执行您问题中提到的任何替代方案 - 它们都非常糟糕.

标签: shell awk


【解决方案1】:

你清理的代码应该是:

awk -v RS="}" -v v1="$bcName" -v s="$str" '$0~v1{gsub(/;/,"");printf "%s%s\n",s,$4;exit}' 
U outlet b.c. = inletOutlet

注意事项:

  • 不要玩 shell 扩展,引用它真的很头疼。使用 -v 很好地传递任何 shell 变量。

  • 您需要用逗号分隔printf 的参数。

  • 始终引用您的 shell 变量!

  • 您应该在 awk 脚本中执行 gsub(/;/,"") 而不是 tr -d ";"

但这可能不是最好的方法,但我不能说,因为没有提供上下文。

【讨论】:

  • 不,它不起作用。由于文件中有许多关键字outlet,因此输出混乱。 :(
  • 那是因为您希望从外壳扩展 $str - sudo_O 可能错过了......但解决方案在他的回答中:使用 -v str="$str" 传递值
  • @TheodrosZelleke 好地方错过了那个,由于 OP 提供的新信息,答案无论如何都需要修改。
  • 大声笑,@sudo_O,你能教我如何在我的情况下添加gsub吗?所以我不再需要tr。谢谢
  • 顺便说一句,我也很惊讶,因为在 shell 中 printf 不需要逗号,但我必须在 awk 中使用逗号。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2011-05-12
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多