awk 的 printf 插入多个变量的正确语法是什么?

cra*_*aus 4 bash awk printf

我复制了一些使用 printf 输出字符串在文件中出现的频率的代码。

awk ' BEGIN {  print "The number of times a appears in the file:" ; }
/a/ {  a_counter+=1  ;  }
END {  printf "%s\n",  a_counter ; }
'  $file
Run Code Online (Sandbox Code Playgroud)

将模式修改为变量后,我想将该模式包含到 printf 命令中,位于计数旁边:

awk -v a="$GENE1" ' BEGIN {  print "The number of times", a, " appears in the file are:" ; }
$0 ~ a {  a_counter+=1  ;  }
END {  printf "%s\n", a, a_counter ; }
'  $file
Run Code Online (Sandbox Code Playgroud)

现在它只打印a的值,而不打印a_counter的值。我读到这printf更复杂,我可能不应该添加用“,”分隔的多个字符串,就像我可以用print. 但我找不到正确的方法?我当然可以坚持下去print,但我想了解我做错了什么,以防万一printf?

Joh*_*024 5

对于每个变量,您都需要一个格式字符串,例如%s。所以,尝试:

printf "%s %s\n", a, a_counter
Run Code Online (Sandbox Code Playgroud)

或者:

printf "pattern=%s and count=%s\n", a, a_counter
Run Code Online (Sandbox Code Playgroud)

%s将任何变量转换为字符串。如果变量是数字,则其他格式(例如%f或%e)可以让您更好地控制如何将数字转换为字符串。man awk详情请参阅。

例子

$ awk -v a="genie" -v a_counter=3 'BEGIN{ printf "%s %s\n", a, a_counter }' 
genie 3
$ awk -v a="genie" -v a_counter=3 'BEGIN{ printf "pattern=%s and count=%s\n", a, a_counter }' 
pattern=genie and count=3
$ awk -v a="genie" -v a_counter=3 'BEGIN{ printf "pattern=%s and count=%7.2f\n", a, a_counter }' 
pattern=genie and count=   3.00
$ awk -v a="genie" -v a_counter=3 'BEGIN{ printf "pattern=%s and count=%9.2e\n", a, a_counter }' 
pattern=genie and count= 3.00e+00
Run Code Online (Sandbox Code Playgroud)