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

How to use printf to print a character multiple times?

使用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}'
-

我认为 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)),但它在我的系统上确实如此。

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

l = some_value

print gensub(/ /, "-", "g", sprintf("%*s", l, ""))

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

的值

这是GNU Awk 3.1.8

如果您可以假设结果应该有多长的(适度)上限,那么这样的事情怎么样:

l = 5;
print substr("---------------------", 1, l);

除了非常简单之外,这还有一个好处,即它可以在缺少“gensub()”函数的 AWK 版本中使用。