如何使用printf多次打印字符?

时间:2016-05-18 09:36:54

标签: awk printf gawk

使用printf,可以多次打印字符:

$ printf "%0.s-" {1..5}
-----

awk我知道我可以something like

$ awk 'BEGIN {while (i++ < 5) printf "-"}'
-----

但我想知道awk's printf是否允许这样做。

我浏览了printf modifiers页但无法找到。总而言之,来自Bash的printf的作用是扩展{1..5}并为其获得的每个参数打印-,所以它相当于说

$ printf "%0.s-" hello how are you 42
-----

但是,我缺乏如何使用awk的printf来模仿这种行为的知识,如果可能的话,因为这会失败:

$ awk 'BEGIN {printf "%0.s-", 1 2 3 4 5}'
-

2 个答案:

答案 0 :(得分:9)

我不相信这可以用awk的printf作为there is also no way to do this just with printf in C and C++

使用awk,我认为最合理的选择是使用像你一样的循环。如果出于某种原因,性能至关重要且awk正在制造瓶颈,那么以下内容将加快速度:

awk 'BEGIN {s=sprintf("%5s","");gsub(/ /,"-",s);print s}'

此命令将以对数方式更快地运行 [1] 但是,除非您计划多次打印字符,否则它不会导致性能明显不同。 (打印一个字符1,000,000次将快约13倍。)

另外,如果你想要一个单行并使用gawk,即使它是最慢的一堆:

gawk 'BEGIN {print gensub(/ /,"-","g",sprintf("%5s",""));}'

[1] 虽然sprintf / gsub命令应该总是比使用循环更快,但我不确定awk的所有版本是否与我的相同。我也不明白为什么while-loop awk命令的时间复杂度为O(n * log(n)),但它确实在我的系统上。

答案 1 :(得分:4)

我知道这是旧的,但可以使用宽度修饰符,例如

from flask_mail import Message
from app import mail
msg = Message('test subject', sender='my-gmail-adress',recipients=['my-gmail-adress'])
msg.body = 'text body'
msg.html = '<h1>HTML body</h1>'
mail.send(msg)

将打印一个可变数量 - 取决于l

的值

这是l = some_value print gensub(/ /, "-", "g", sprintf("%*s", l, ""))