Awk พิมพ์ความกว้างและปัดเศษขึ้น


20

ฉันจำเป็นต้องprintfออกจำนวน แต่มีความกว้างที่กำหนดและโค้งมน (กับ awk!)

%10s

ฉันมีสิ่งนี้และอย่างใดฉันต้องเชื่อมต่อ%dแต่ทุกอย่างที่ฉันทำจบลงด้วย parametres มากเกินไปสำหรับ awk (เพราะฉันมีคอลัมน์เพิ่มเติม)

คำตอบ:


27

คุณสามารถลองสิ่งนี้:

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

ตัวเลือกรูปแบบของเรามีสองส่วน:

  • 3: ความหมายของเอาต์พุตจะถูกเพิ่มเป็น 3 ตัวอักษร
  • .0f: ความหมายของเอาต์พุตจะไม่มีความแม่นยำหมายถึงการปัดเศษขึ้น

จากman awkคุณสามารถดูรายละเอียดเพิ่มเติมได้ที่:

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

ใช้ตัว%fระบุรูปแบบหมายเลข (จุดลอยตัว) ของคุณจะถูกปัดเศษโดยอัตโนมัติตามที่คุณระบุ ตัวอย่างเช่นการปัดเศษค่าเป็นตัวเลขทั้งหมดจะใช้

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

หากคุณต้องการตัวเลขต่อท้ายเพียงเปลี่ยนความแม่นยำ


เป็น/dev/nullสิ่งที่จำเป็น?
Avinash Raj

หากคำสั่งเดียวของคุณอยู่ในBEGINบล็อกนั่นไม่ใช่ ฉันทดสอบกับการแสดงออกในร่างกายปกติก่อนดังนั้นจึงเป็น culpa ขอบคุณ @Gnouc
Andreas Wiese

3

Awk ใช้ sprintf ด้านล่างและมันจะเป็นการปัดเศษที่ไม่เอนเอียงดังนั้นขึ้นอยู่กับแพลตฟอร์มของคุณหากคุณต้องการให้มันปัดเศษขึ้นคุณอาจจำเป็นต้องใช้สิ่งนี้:

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

การไม่ทราบว่าสิ่งนี้สามารถนำไปสู่ข้อบกพร่องที่ลึกซึ้ง แต่น่ารังเกียจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.