Awk printf numarasını genişlik ve yuvarlama


20

Ben bir sayı dışarı yazdırmak gerekiyor , ama verilen genişlik ve yuvarlak (awk ile!)

%10s

Ben bu ve bir şekilde bağlamak gerekir %dama yaptığım her şey, awk için çok fazla parametre ile sonuçlanır (çünkü daha fazla sütun var).

Yanıtlar:


27

Bunu deneyebilirsiniz:

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

Format seçeneğimiz iki bölümden oluşur:

  • 3: anlamı çıktı 3 karaktere kadar doldurulur.
  • .0f: anlamı çıktı hassas olmaz, yani yuvarlanır.

Kimden man awkdaha fazla ayrıntı görebilirsiniz:

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.

9

%fBiçim belirleyicisini kullanarak, (kayan nokta) numaranız belirttiğiniz gibi otomatik olarak yuvarlanır. Örneğin, bir değeri tam sayılara yuvarlamak için şunu kullanın:

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

Daha fazla izleyen basamak istiyorsanız, hassasiyeti değiştirmeniz yeterlidir.


olan /dev/nullgerekli?
Avinash Raj

Tek ifadeleriniz BEGINbloktaysa, değildir. Önce normal vücuttaki ifade ile test ettim, bu yüzden mea culpa. Teşekkürler, @Gnouc.
Andreas Wiese

3

Awk altında sprintf kullanır ve tarafsız bir yuvarlama yapar, bu nedenle platformunuza bağlı olarak DAİMA yuvarlamanızı istiyorsanız böyle bir şey kullanmanız gerekebilir:

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

Bunun farkına varmamak ince ama kötü hatalara yol açabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.