awkprintfgawk

How to use printf to print a character multiple times?


Using printf, one can print a character multiple times:

$ printf "%0.s-" {1..5}
-----

In awk I know that I can do something like:

$ awk 'BEGIN {while (i++ < 5) printf "-"}'
-----

But I wonder if awk's printf allows this as well.

I went through the printf modifiers page but could not find how. All in all, what the printf from Bash does is to expand {1..5} and print a - for every parameter it gets, so it is equivalent to saying

$ printf "%0.s-" hello how are you 42
-----

However, I lack the knowledge on how to mimic this behaviour with awk's printf, if it is possible, because this fails:

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

Solution

  • I do not believe this is possible with awk's printf, as there is also no way to do this just with printf in C and C++.

    With awk, I think the most reasonable option is using a loop like you have. If for some reason performance is vital and awk is creating a bottleneck, the following will speed things up:

    awk 'BEGIN {s=sprintf("%5s","");gsub(/ /,"-",s);print s}'
    

    This command will run logarithmically faster[1] Though, it won't cause a noticeable difference in performance unless you're planning on printing a character many times. (Printing a character 1,000,000 times will be about 13x faster.)

    Also, if you want a one-liner and are using gawk, even though it's the slowest of the bunch:

    gawk 'BEGIN {print gensub(/ /,"-","g",sprintf("%5s",""));}'
    

     

    [1] While the sprintf/gsub command should always be faster than using a loop, I'm not sure if all versions of awk will behave the same as mine. I also do not understand why the while-loop awk command would have a time complexity of O(n*log(n)), but it does on my system.