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

时间:2018-02-25 22:51:56

标签: 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

将模式修改为变量后,我希望将模式包含在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

现在它只打印a的值,而不是a_counter的值。我读到printf更复杂,我可能不应该添加多个以“,”分隔的字符串,就像我使用print一样。但我找不到合适的方法吗?当然我可以坚持使用print,但我想了解我在printf的情况下做错了什么?

1 个答案:

答案 0 :(得分:4)

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

printf "%s %s\n", a, a_counter

或者:

printf "pattern=%s and count=%s\n", a, a_counter

%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
相关问题