awkスクリプトで "$ n"を文字列bash変数として使用しますか?

awkスクリプトで

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}

私は何が間違っていましたか?

「$3」のすべてのインスタンスを「$foo」に置き換えてスクリプトを変更するには、$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

次のオプションを使用して、シェル変数を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必要な数に拡張できます。

おすすめ記事