在 awk 脚本中使用“$n”作为字符串 bash 变量?

在 awk 脚本中使用“$n”作为字符串 bash 变量?

我在 bash 脚本中有一个 awk 脚本,我开始概括它。

我想将字符串“$3”放入 bash 变量中,并在 awk 脚本中使用该变量。这将使我能够根据需要轻松更新脚本。

例如:

NR > 1 && $3 != p { 
   #blah blah blah 
   printf("%s_%s%s", $3, header[i], OFS) 
}

会变成类似的东西

foo="$3"
NR > 1 && $foo != p { 
   #blah blah blah 
   printf("%s_%s%s", $foo, header[i], OFS) 
}

我尝试了foo="$3"='$3'"$foo"'$foo'和 的各种组合,但${foo}无法使其工作。

我究竟做错了什么?

我想用“$foo”替换“$3”的每个实例,这样如果我想更改脚本,我只需要更新$foo。

bash 脚本内的完整 awk 脚本:

#!/bin/bash

#these are bash variables
file=$1
header=$(head -n1 $file)


############################
# awk script               #
############################
read -d '' awkscript << 'EOF'
BEGIN { OFS = "\\t" }

/^@/  {
   for (i = 1; i <= NF; ++i)
      header[i] = $i
   next
}

NR > 1 && $3 != p {
   #output two blank lines if needed
   if (print_blank) {
      print "\\n"
   }
   print_blank = 1 

   for (i = 1; i <= 3; ++i)
      printf("%s%s", header[i], OFS)

   for (i = 4; i < NF; ++i)
      printf("%s_%s%s", $3, header[i], OFS)
   printf("%s_%s%s", $3, header[NF], ORS)
}

{ p=$3; print }
EOF

############################
# end awk script           #
############################

#blah
#blah
#blah

awk "$awkscript" ${tmp} > ${output}

答案1

您可以使用以下选项将 shell 变量注入到 awk 脚本中-v

#!/bin/bash

#these are bash variables
file=$1
header=$(head -n1 $file)
awktoken=$2

############################
# awk script               #
############################
read -d '' awkscript << 'EOF'
BEGIN { OFS = "\\t" }

/^@/  {
   for (i = 1; i <= NF; ++i)
      header[i] = $i
   next
}

NR > 1 && $variable != p {
   #output two blank lines if needed
   if (print_blank) {
      print "\\n"
   }
   print_blank = 1 

   for (i = 1; i <= 3; ++i)
      printf("%s%s", header[i], OFS)

   for (i = 4; i < NF; ++i)
      printf("%s_%s%s", $variable, header[i], OFS)
   printf("%s_%s%s", $variable, header[NF], ORS)
}

{ p=$variable; print }
EOF

############################
# end awk script           #
############################

awk -vvariable="$awktoken" "$awkscript" ${tmp} > ${output}

variable是本例中变量的名称。通常,您会在不带 的情况下调用它,$但会保留该值以使其扩展到$3或您选择的任何数字

相关内容