使用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)),但它确实在我的系统上.
我知道这很旧,但是可以使用width修饰符,例如
l = some_value
print gensub(/ /, "-", "g", sprintf("%*s", l, ""))
Run Code Online (Sandbox Code Playgroud)
将打印可变数量的-取决于l的值
这是 GNU Awk 3.1.8