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

fed*_*qui 9 awk printf gawk

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

$ printf "%0.s-" {1..5}
-----
Run Code Online (Sandbox Code Playgroud)

awk我知道我可以做类似:

$ awk 'BEGIN {while (i++ < 5) printf "-"}'
-----
Run Code Online (Sandbox Code Playgroud)

但我想知道awk是否printf允许这样做.

我浏览了printf修饰符页面,但无法找到.总而言之,Bash的printf是为每个参数扩展{1..5}和打印一个-,所以它相当于说

$ printf "%0.s-" hello how are you 42
-----
Run Code Online (Sandbox Code Playgroud)

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

$ awk 'BEGIN {printf "%0.s-", 1 2 3 4 5}'
-
Run Code Online (Sandbox Code Playgroud)

Jef*_*ash 10

我不相信awk的printf可以实现这一点,因为在C和C++中也没有办法用printf来做到这一点.

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

awk 'BEGIN {s=sprintf("%5s","");gsub(/ /,"-",s);print s}'
Run Code Online (Sandbox Code Playgroud)

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

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

gawk 'BEGIN {print gensub(/ /,"-","g",sprintf("%5s",""));}'
Run Code Online (Sandbox Code Playgroud)

 

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

  • 辉煌!您能分享一下您如何了解时间复杂性的见解吗?我定时'awk'BEGIN {while(i ++ <1000000)printf" - "}'`和'awk'BEGIN {s = sprintf("%1000000s",""); gsub(/ /," - ",s) ; print s}'`,差异是0.102s vs 0.115s. (3认同)

Mau*_*408 5

我知道这很旧,但是可以使用width修饰符,例如

l = some_value

print gensub(/ /, "-", "g", sprintf("%*s", l, ""))
Run Code Online (Sandbox Code Playgroud)

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

这是 GNU Awk 3.1.8