将shell变量传递给awk命令

时间:2017-03-29 17:57:51

标签: bash shell awk

我有一个循环来处理dir中的一堆文件。我想将文件名输入到它处理的文件中,但我收到了错误。它与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

2 个答案:

答案 0 :(得分:1)

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

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}"

答案 1 :(得分:0)

如果你可以避免批处理循环,它会更好(主要用于子shell分叉,......)

# 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}