2016-05-18 3 views
7

Mit printf kann man ein Zeichen mehrfach drucken:Wie printf verwenden, um ein Zeichen mehrmals zu drucken?

In awk Ich weiß, dass ich something like tun können:

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

Aber ich frage mich, ob awk's printf dies auch erlaubt.

Ich ging durch die printf modifiers Seite, konnte aber nicht finden, wie. Alles in allem macht, was die printf von Bash ist {1..5} zu erweitern und eine - für jeden Parameter drucken es wird, so ist es gleichbedeutend mit der Aussage

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

Allerdings fehlt mir das Wissen darüber, wie dieses Verhalten zu imitieren mit awk ist printf, wenn es möglich ist, weil dies nicht gelingt:

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

Mmmm, Perl kann es auch tun ... 'perl -e„print ‚5'x60" ' :-) –

+0

@MarkSetchell 'awk 'ist das nicht schlau:/Weder" drucke "noch ein" 3 "oder" drucke "ein" x 3 ". – fedorqui

Antwort

6

ich glaube nicht, das ist möglich mit awk der printf, wie there is also no way to do this just with printf in C and C++.

Mit awk denke ich, die sinnvollste Option ist die Verwendung einer Schleife wie Sie haben. Wenn aus irgendeinem Grunde entscheidende Performance und awk ist einen Engpass zu schaffen, wird die folgenden Dinge beschleunigen:

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

Dieser Befehl [1] Obwohl logarithmisch schneller läuft, wird es keinen spürbaren Unterschied verursacht in Leistung, es sei denn, Sie planen, einen Charakter viele Male zu drucken. (Druck ein Zeichen 1.000.000 Mal wird etwa 13x schneller.)

Auch, wenn Sie einen Einzeiler wollen und gaffen verwenden, obwohl es die langsamste im Bund ist:

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

 

[1] Während der Befehl sprintf/gsub immer schneller sein sollte als eine Schleife, bin ich mir nicht sicher, ob sich alle Versionen von awk genauso verhalten wie meine. Ich verstehe auch nicht, warum der Befehl while-loop awk eine Zeitkomplexität von O (n * log (n)) haben würde, aber auf meinem System.

+2

Brilliant! Könnten Sie uns einen Einblick geben, wie Sie die zeitliche Komplexität kennengelernt haben? Ich habe 'awk' BEGIN {while (i ++ <1000000) printf "-"} ''und' awk' BEGIN {s = sprintf ("% 1000000s", ""); gsub (/ /, "-", s) ; print s} ''und der Unterschied war 0,102s vs 0,115s. – fedorqui

+1

Absolut.Ich habe eine Bash-Funktion geschrieben, um vier verschiedene awk-Befehle zu benchmarken: die while-Schleife, die 'gsub'-Datei, die' gensub'-Zeile und ein Steuerelement, das nur einen einzigen Bindestrich druckt. Diese Funktion testete alle Befehle gegen eine Vielzahl von Eingabe- und Wiederholungslängen und subtrahierte die Dummy-Zeit von den anderen drei. Daraus habe ich festgestellt, dass die Gensub eine viel langsamer als der Rest war, also habe ich mich gerade auf vs vs gsub konzentriert. Dann nahm ich meine Daten und spielte mit Wolframalpha, benutzerdefinierten mathematischen Funktionen und einem Google-Blatt herum und führte mich zu diesen großen O-Werten. –

+0

[Hier ist eine der Google-Tabellen] (https://docs.google.com/spreadsheets/d/1P8neMgoyJf34uoV1JtQ3hiEZuL0LWnl55z0zTXjwJ-E/edit?usp=sharing), falls Sie neugierig sind. Es ist der einzige Teil des Prozesses, den ich noch habe –

1

Ich weiß, das ist alt, aber die Breite Modifikator kann z.

l = some_value

Druck gensub (//"-", "g", sprintf ("% * s", L, ""))

wird eine variable Anzahl von Druck - je nach dem Wert von l

Dies war GNU awk 3.1.8