Use sprintf
创建一串空格,然后使用gsub
将每个空格替换为x
:
$ time awk 'BEGIN {s = sprintf("%*s", 100000000, ""); gsub(".", "x", s)}'
real 0m1.744s
user 0m1.645s
sys 0m0.098s
这可以包裹在一个awk
功能:
function mkStr(c, n, s) {
s = sprintf("%*s", n, "");
gsub(".", c, s);
return s;
}
(s
是一个参数,只是将变量的范围限定为函数;它不需要参数,事实上,传递的任何参数都将被忽略。)
更新:根据版本的不同,性能似乎存在显着差异awk
您正在使用。上面的测试使用的是20070501,BSD(?)awk
随 macOS 一起提供。gawk-5.1.0
需要更长的时间。
我不知道是什么造成了这种差异;也许有一个在两个版本中都很快的解决方案。
更新 2:Ed Morton(在评论中)已证实gsub
是造成运行时间缓慢的原因gawk
,找不到解决方法,并已提交错误报告 https://lists.gnu.org/archive/html/bug-gawk/2021-07/msg00030.html与维护者。