Awk nomor printf dengan lebar dan bulatkan

20

Saya perlu mencetak nomor keluar, tetapi dengan lebar dan dibulatkan (dengan awk!)

%10s

Saya punya ini dan entah bagaimana saya perlu menghubungkan %dtetapi semua yang saya lakukan, berakhir dengan terlalu banyak parameter untuk awk (karena saya memiliki lebih banyak kolom).

Pengembara
sumber

Jawaban:

27

Anda dapat mencoba ini:

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

Opsi format kami memiliki dua bagian:

  • 3: berarti output akan diisi hingga 3 karakter.
  • .0f: berarti output tidak akan memiliki presisi, yang berarti dibulatkan.

Dari man awk, Anda dapat melihat detail lebih lanjut:

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
sumber
9

Menggunakan penentu %fformat, nomor (titik mengambang) Anda akan dibulatkan secara otomatis seperti yang Anda tentukan. Misalnya, untuk membulatkan nilai ke seluruh angka digunakan

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

Jika Anda ingin lebih banyak digit tambahan, cukup ganti presisi.

Andreas Wiese
sumber
Apakah /dev/nullperlu?
Avinash Raj
Jika satu-satunya pernyataan Anda di BEGINblokir, itu bukan. Saya menguji dengan ekspresi di tubuh normal terlebih dahulu, jadi mea culpa. Terima kasih, @Gnouc.
Andreas Wiese
3

Awk menggunakan sprintf di bawahnya dan itu melakukan pembulatan yang tidak bias, jadi tergantung pada platform Anda jika Anda ingin SELALU membulatkannya, Anda mungkin perlu menggunakan sesuatu seperti ini:

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

Tidak menyadari hal ini dapat menyebabkan bug yang halus tapi jahat.

Blake Barnett
sumber