Как использовать 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