【问题标题】:Override variables in AWK scripts in command line/mother scripts在命令行/母脚本中覆盖 AWK 脚本中的变量
【发布时间】:2014-08-19 00:05:15
【问题描述】:

如果我们有一个像这样的 AWK 脚本 (average.sh) 并且想用它来处理大量的输入文件:

awk -F\" 'BEGIN{print}
  last != $4""$8 && last{
      print line,exp(C/D)
      C=D=0}
  { # This block process each line of infile
   C += log($(NF-1)+0)
   D++
   $(NF-1)=""
   line=$0
   last=$4""$8}
  END{ # This block triggers after the complete file read
       # to print the last average that cannot be trigger during
       # the previous block
      print line,exp(C/D)}' ${var2:=infile}

如果我们这样做了

export var2="infile4" | sh average.sh

“average.sh”仍然处理“infile”而不是“infile4”。

按照Override a variable in a Bash script from the command line 中的最佳答案,我们尝试

var2=infile4 ./geometric_average_real

这会给出“var2=infile: Command not found”的错误。

我们的最终目标是编写循环

for (X=1; X<=3; X++)

do

sh average.sh infile${X}

done

所以这个循环应该处理

sh average.sh infile1
sh average.sh infile2
sh average.sh infile3

【问题讨论】:

  • export var2="infile4" | sh average.sh 不应使用管道。那应该是分隔命令的分号。管道正在给您带来问题,因为您正在生成子壳。尝试不使用它。
  • var2=infile4 ./geometric_average_realbash 中应该可以正常工作,但在其他shell 中可能无法正常工作(几乎可以肯定在sh 中不行)。如果您想要 bash 语义,请确保您尝试使用 bash 而不是 sh
  • 如果您在 shell 脚本中使用位置参数参数而不是命名变量(如 var2),则使用类似目标的参数应该可以正常工作。您是否尝试过,但它以某种方式不起作用?
  • 是的,伊坦! "export var2="infile4" ; sh average.sh" 有效!
  • 对了,你不用写$4""$8$4 $8 可以正常工作,$4$8 也可以。如果ab 是两个变量,则a b 是它们的字符串连接。只需注意 awk 对于不可见的连接运算符的奇怪表达式优先级。

标签: bash variables awk overwrite


【解决方案1】:

如果您的 average.sh 脚本适用于单个 infile,则只需从另一个脚本中调用它,其中包含您要处理的文件列表:

#!/bin/bash

test -n "$1" || { echo "error, insufficient input"; exit 1; }

avgscript="/path/to/average.sh"

test -x "$avgscript" || { echo "error: required script `$avgscript` not found or not executable"; exit 1; }

for i in "$@"; do

    avgscript "$i"

done

将该文件保存为runavg.sh,然后只需调用runavg.sh file1 file2 file2

【讨论】:

  • 嗨大卫,感谢您的评论!但是,如果我们没有在 .....print line,exp(C/D)}' 后面加上文件名,就会出现错误信息 "awk: cmd. line 14 ^ unexpected newline or end of string ”。我在 bash 中使用“sh average.sh input.csv”
  • 好吧,该死的。你能把整个 awk 脚本放在上面的脚本中,它在 for 循环中的 $( your awk script "$i" ) 中写着 avgscript,并用双引号引起替换吗?
  • for i; do 也会遍历所有位置参数。
猜你喜欢
  • 2011-06-04
  • 2014-04-29
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多