Awk số printf chiều rộng và làm tròn nó lên


20

Tôi cần phải printf một số ra, nhưng với chiều rộng nhất định và được làm tròn (với awk!)

%10s

Tôi có cái này và bằng cách nào đó tôi cần kết nối %dnhưng tất cả mọi thứ tôi làm, kết thúc với quá nhiều thông số cho awk (vì tôi có nhiều cột hơn).

Câu trả lời:


27

Bạn có thể thử điều này:

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

Tùy chọn định dạng của chúng tôi có hai phần:

  • 3: có nghĩa là đầu ra sẽ được đệm thành 3 ký tự.
  • .0f: có nghĩa là đầu ra sẽ không có độ chính xác, nghĩa là làm tròn lên.

Từ man awk, bạn có thể xem thêm chi tiết:

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

Sử dụng công %fcụ xác định định dạng, số (dấu phẩy động) của bạn sẽ tự động được làm tròn như bạn chỉ định. Ví dụ: để làm tròn một giá trị cho toàn bộ số sử dụng

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

Nếu bạn muốn chữ số tiếp theo, chỉ cần thay đổi độ chính xác.


/dev/nullcần thiết không
Avinash Raj

Nếu báo cáo duy nhất của bạn nằm trong BEGINkhối, thì không. Tôi đã thử nghiệm với các biểu hiện trong cơ thể bình thường đầu tiên, do đó mea culpa. Cảm ơn, @Gnouc.
Andreas Wiese

3

Awk sử dụng sprintf bên dưới và nó không làm tròn thiên vị, do đó tùy thuộc vào nền tảng của bạn nếu bạn muốn nó LUÔN làm tròn bạn có thể cần phải sử dụng một cái gì đó như thế này:

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

Không nhận ra điều này có thể dẫn đến các lỗi tinh vi nhưng khó chịu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.