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

Awk 如何使用printf多次打印字符?,awk,printf,gawk,Awk,Printf,Gawk,使用,可以多次打印字符: $ printf "%0.s-" {1..5} ----- 在awk中,我知道我可以做到: 但是,如果可能的话,我缺乏关于如何用awk的printf模拟这种行为的知识,因为这样做失败了: $ awk 'BEGIN {printf "%0.s-", 1 2 3 4 5}' - 我认为这在awk的printf中是不可能的 对于awk,我认为最合理的选择是使用像您这样的循环。如果出于某种原因,性能至关重要,而awk正在制造瓶颈,则以下操作将加快速度: awk 'BEGIN

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

$ printf "%0.s-" {1..5}
-----
awk
中,我知道我可以做到:

但是,如果可能的话,我缺乏关于如何用awk的printf模拟这种行为的知识,因为这样做失败了:

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

我认为这在awk的printf中是不可能的

对于awk,我认为最合理的选择是使用像您这样的循环。如果出于某种原因,性能至关重要,而awk正在制造瓶颈,则以下操作将加快速度:

awk 'BEGIN {s=sprintf("%5s","");gsub(/ /,"-",s);print s}'
此命令将以对数速度运行[1],但除非您计划多次打印字符,否则不会造成明显的性能差异。(打印一个字符1000000次将快约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的值打印一个可变数量的


这是GNUAWK3.1.8

Mmmm,Perl也能做到
perl-e“print'5'x60”
:-)@MarkSetchell
awk
没有那么聪明:/code>print“a”*3和
print“a”x3
都不管用。太棒了!你能分享一下你是如何了解时间复杂性的吗?我计时了
awk'BEGIN{while(I++<1000000)printf“-“}”
awk'BEGIN{s=sprintf(“%1000000s”);gsub(//,“-”,s);print s}
,差为0.102s vs 0.115s。我编写了一个bash函数来测试四个不同的awk命令:while循环、gsubone、
gensub
one和一个只打印一个破折号的控件。该函数针对各种长度的输入和重复测试所有命令,从其他三个命令中减去虚拟时间。从这一点上,我发现gensub的速度比其他的要慢得多,所以我只关注while vs gsub。然后我拿着我的数据,用wolframalpha、自定义数学函数和谷歌表进行处理,让我找到那些大O值,以防你好奇。这是我剩下的唯一一部分
gawk 'BEGIN {print gensub(/ /,"-","g",sprintf("%5s",""));}'
l = some_value

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