shell 脚本中的多行 awk 脚本

Posted

技术标签:

【中文标题】shell 脚本中的多行 awk 脚本【英文标题】:multiline awk script inside shell script 【发布时间】:2021-11-11 09:28:43 【问题描述】:
#!/usr/bin/tcsh

 cmd='BEGINc=0
      if($1=="Net")print $0

       if($1=="v14")
       
         if($4>=200)
           print "Drop more than 200 at "$1
          

              '

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

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

这给出了如下错误

     awk: fatal: can't open source file `BEGINc=0
          if($1=="Net")print $0

           if($1=="v14")
           
             if($4>=200)
              print"Drop more than 200 at $1
               

                ' for reading (No such file or directory)

我的任务是如何执行其中包含多行 awk 脚本的 shell 脚本? 你能帮我解决这个问题吗?即使在谷歌/参考手册中搜索后我也无法弄清楚?

【问题讨论】:

供您参考:Top 10 Reasons not to use C Shell 和 Csh programming considered harmful 【参考方案1】:

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

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

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

【讨论】:

这实际上帮助我解决了错误。但脚本输出不正确。 awk 脚本未正确执行。可能将 awk 脚本设置为 shelll 变量是个坏主意。有什么方法可以执行包含多行 awk 脚本的 shell 脚本。 @Ajayshifu 您的 awk 脚本需要修复。调试您的 awk 脚本。见:How to debug an AWK script @Gris Lea,感谢您提供的信息。【参考方案2】:
    不要编写 [t]csh 脚本,查看 https://www.google.com/search?q=csh+why+not 的许多结果中的任何一个,使用 Bourne 派生的 shell,如 bash。 不要将 awk 脚本存储在 shell 变量中,然后让 awk 解释该变量的内容,只需将脚本存储在函数中并调用它即可。

所以,做这样的事情:

#!/usr/bin/env bash

foo() 
    awk '
         print "whatever", $0 
    ' "$@:--"


foo input_file.txt > output_file.txt

【讨论】:

这就是我要找的。非常感谢 不客气。请参阅***.com/help/someone-answers 了解如何上网。【参考方案3】:

这是等效的脚本

$1=="Net"
$1=="v14" && $4>=200 print "Drop more than 200 at "$1

保存到文件中,例如test.awk 并运行为

$ awk -f test.awk input_file > output_file

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

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

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

【讨论】:

在我的情况下,我需要将该 awk 脚本嵌入到其他人编写的 shell 脚本中。所以我的问题实际上是“如何将多行 awk 脚本嵌入到 shell 脚本中并执行 shell 脚本?” 一个脚本可以像awk一样调用其他脚本,也可以在awk调用中内联脚本。不确定您要解决的问题。

以上是关于shell 脚本中的多行 awk 脚本的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将脚本传递给shell变量中的awk?

编shell脚本遇到一个问题,awk能切割掉最后一个字段的值嘛?

使用 JAVA 多行输出作为 shell 脚本中的变量

是否可以在 shell 脚本中的多行命令中包含内联注释? [复制]

Shell脚本之awk详解

Linux13 shell函数数组及awkawk中的数组