Awk printf Nummer in der Breite und runden Sie es auf

20

Ich muß printf eine Reihe, aber mit vorgegebener Breite und gerundet (mit awk!)

%10s

Ich habe dies und irgendwie muss ich das verbinden, %daber alles, was ich tue, endet mit zu vielen Parametern für awk (weil ich mehr Spalten habe).

Wanderer
quelle

Antworten:

27

Sie können dies versuchen:

$ awk 'BEGIN{printf "%3.0f\n", 3.6}'
  4

Unsere Formatoption besteht aus zwei Teilen:

  • 3: Bedeutet, dass die Ausgabe auf 3 Zeichen aufgefüllt wird.
  • .0f: Bedeutet, dass die Ausgabe keine Genauigkeit hat, dh aufgerundet.

Ab man awkkönnen Sie weitere Details sehen:

width   The field should be padded to this width. The field is normally padded
        with spaces. If the 0  flag  has  been  used, it is padded with zeroes.

.prec   A number that specifies the precision to use when printing.  For the %e,
        %E, %f and %F, formats, this specifies the number of digits you want
        printed to the right of the decimal point. For the %g, and %G formats,
        it specifies the maximum number of significant  digits. For the %d, %o,
        %i, %u, %x, and %X formats, it specifies the minimum number of digits to
        print. For %s, it specifies the maximum number of characters from the
        string that should be printed.
cuonglm
quelle
9

Wenn Sie den %fFormatbezeichner verwenden, wird Ihre (Gleitkomma-) Zahl bei der Angabe automatisch gerundet. Verwenden Sie beispielsweise, um einen Wert auf ganze Zahlen zu runden

$ awk 'BEGIN { printf("%.0f\n", 1.49); }'
1
$ awk 'BEGIN { printf("%.0f\n", 1.5); }'
2

Wenn Sie weitere nachgestellte Ziffern wünschen, ändern Sie einfach die Genauigkeit.

Andreas Wiese
quelle
ist /dev/null notwendig?
Avinash Raj
Wenn sich Ihre einzigen Anweisungen im BEGINBlock befinden, ist dies nicht der Fall. Ich testete zuerst mit dem Ausdruck im normalen Körper, also mea culpa. Danke, @Gnouc.
Andreas Wiese
3

Awk verwendet Sprintf darunter und rundet unvoreingenommen. Abhängig von Ihrer Plattform müssen Sie also möglicherweise Folgendes verwenden, wenn Sie IMMER eine Abrundung wünschen:

awk "BEGIN { x+=(5/2); printf('%.0f', (x == int(x)) ? x : int(x)+1) }"

Wird dies nicht bemerkt, kann dies zu subtilen, aber unangenehmen Fehlern führen.

Blake Barnett
quelle