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).

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.

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.