使用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}'
-
答案 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, ""))