【问题标题】:Passing a shell variable into an awk command将 shell 变量传递给 awk 命令
【发布时间】:2017-03-29 17:57:50
【问题描述】:

我有一个循环处理目录中的一堆文件。我想将文件名输入到它处理的文件中,但出现错误。它与myvar 语法完美配合,但出于显而易见的原因,我需要它。

错误

awk: cmd. line:1: RS=
awk: cmd. line:1:    ^ unexpected newline or end of string

命令

for filename in $files
do
    awk -v "myvar=${filename}" 
      RS= '/-- Ticket/{++i; print "PROMPT myvar Line ", 
      i ORS $0 ORS; i+=split($0, a, /\n/)+1}' ${filename}.txt
done

【问题讨论】:

  • awk -v myvar="$filename" -v RS= '/-- Ticket/{++i; print "PROMPT", myvar, "Line ", i ORS $0 ORS; i+=split($0, a, /\n/)+1}' "$filename.txt"

标签: bash shell awk


【解决方案1】:

这里有几个问题,对您尝试传递给awk 的每个变量使用-v 语法,

awk -v myvar="${filename}" -v RS= '/-- Ticket/{++i; print "PROMPT " myvar " Line ", i ORS $0 ORS; i+=split($0, a, /\n/)+1}' ${filename}.txt
#  ^^^ variable1           ^^^^^ variable2 --> using separate -v for each

应该是正确的方法。

对于导入到awk 的shell 变量,请按照我上面的示例进行操作,而不是"myvar=${filename}",而只是myvar="${filename}"

【讨论】:

  • 是的,我确实尝试过这种方法,但我得到的错误是:awk: cmd. line:1: RS= awk: cmd. line:1: ^ unexpected newline or end of string
  • @luckytaxi:完全按照我的回答试试。
  • 对,好的,所以我不得不输入PROMPT myvar Line ,但它没有打印myvar
  • @luckytaxi:参考我的更新,试试awk -v myvar="${filename}" -v RS= '/-- Ticket/{++i; print "PROMPT "myvar" Line ", i ORS $0 ORS; i+=split($0, a, /\n/)+1}' ${filename}.txt
【解决方案2】:

如果您可以避免批处理循环,那就更好了(性能主要针对 subshel​​l fork,...)

# assume TXT_files is the list of $files with .txt extension (not purpose of this OP)
awk RS='' '
   /-- Ticket/{
     # get the file name without extension
     myvar = FILENAME;sub( /\.txt$/,"",myvar)

     print "PROMPT " myvar " Line " ++i ORS $0 ORS

     i += split( $0, a, /\n/) + 1
     }
   ' ${TXT_files}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2014-01-05
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多