shell脚本内的多行awk脚本

m1m5dgzv  于 2022-11-25  发布在  Shell
关注(0)|答案(4)|浏览(233)
#!/usr/bin/tcsh

 cmd='BEGIN{c=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

我正在尝试执行shell脚本,其中包含多行awk脚本。存储awk脚本(特别是多行awk脚本)到一个变量cmd&然后在awk中执行该cmd-f“$cmd”input_file.txt〉output_file.txt。
这将产生如下错误

awk: fatal: can't open source file `BEGIN{c=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)

我的问题是我如何执行shell脚本,其中包含多行awk脚本里面?你能帮我这个,因为我不能figureout即使在谷歌搜索/参考手册?

nafvub8i

nafvub8i1#

当您想要传递文件名称给要执行的指令码时,请使用awk -f
在这里,您的awk脚本是一个内联字符串,因此只需删除-f选项即可解决您的问题。

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

ufj5ltwl2#

1.不要编写[t]csh脚本,查看https://www.google.com/search?q=csh+why+not的任何结果,使用Bourne派生的shell(如bash)。
1.不要将awk脚本存储在shell变量中,然后让awk解释该变量的内容,只需将脚本存储在函数中并调用该函数即可。
因此,请执行以下操作:

#!/usr/bin/env bash

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

foo input_file.txt > output_file.txt
1tuwyuhd

1tuwyuhd3#

这是等效的脚本

$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脚本中。

ss2ws0br

ss2ws0br4#

在tcsh中不知道,但在bash中也可以使用heredoc:

#!/usr/bin/bash

awk -f <(cat - <<-'_EOF_'
BEGIN{c=0}{
      if($1=="Net"){print $0}

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

              }
_EOF_
) input_file.txt > output_file.txt

相关问题