shell 脚本中的多行 awk 脚本

multiline awk script inside shell script

#!/usr/bin/tcsh

 cmd='BEGIN{c=0}{
      if(=="Net"){print [=11=]}

       if(=="v14")
       {
         if(>=200)
           {print "Drop more than 200 at "}
          }

              }'

         
awk -f "$cmd" input_file.txt > output_file.txt

我正在尝试执行 shell 脚本,其中包含多行 awk 脚本。 将 awk 脚本(尤其是多行 awk 脚本)存储到变量 cmd & 然后在 awk -f "$cmd" input_file.txt > output_file.txt.

这给出了如下错误

     awk: fatal: can't open source file `BEGIN{c=0}{
          if(=="Net"){print [=12=]}

           if(=="v14")
           {
             if(>=200)
              {print"Drop more than 200 at }
               }

                }' for reading (No such file or directory)

我的问题是如何执行 shell 包含多行 awk 脚本的脚本? 你能帮我解决这个问题吗,因为即使在 google/reference 手册中搜索后我也无法弄清楚?

当你想传递一个文件名让脚本执行时,你使用awk -f

此处您的 awk 脚本是一个内联字符串,因此只需删除 -f 选项即可解决您的问题。

awk "$cmd" input_file.txt > output_file.txt

这是等效的脚本

=="Net"
=="v14" && >=200 {print "Drop more than 200 at "}

保存到文件中,例如 test.awk 和 运行 as

$ awk -f test.awk input_file > output_file

或者,对于简单的一次性脚本,您可以

$ awk '=="Net"; =="v14" && >=200 {print "Drop more than 200 at "}' input_file > output_file

显然上面的行也可以插入到 shell 脚本中。

  1. 不要编写 [t]csh 脚本,查看 https://www.google.com/search?q=csh+why+not 的许多结果中的任何一个,使用像 bash.
  2. 这样的 Bourne 派生的 shell
  3. 不要将 awk 脚本存储在 shell 变量中,然后让 awk 解释该变量的内容,只需将脚本存储在函数中并调用它。

所以,做这样的事情:

#!/usr/bin/env bash

foo() {
    awk '
        { print "whatever", [=10=] }
    ' "${@:--}"
}

foo input_file.txt > output_file.txt