Как использовать printf для печати символа несколько раз?

используя printf, можно напечатать символ несколько раз:

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

на awk Я знаю, что могу сделать что-то вроде:

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

но интересно, если awk и все!--4--> позволяет это.

я прошел через printf модификаторы страница, но не смог найти как. В целом, то, что делает printf от Bash, - это развернуть {1..5} и печать - для каждого параметра gets, поэтому это эквивалентно высказыванию

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

однако мне не хватает знаний о том, как имитировать это поведение с помощью printf awk, если это возможно, потому что это не удается:

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

2 ответов


Я не верю, что это возможно с помощью printf awk, as нет возможности сделать это только с printf в C и C++.

С 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

печать gensub (/ / ," -", "g", sprintf ("%*s", l, ""))

выведет переменное число - в зависимости от значения l

Это был GNU Awk 3.1.8