如何使用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 版本中使用。
使用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 版本中使用。