幅のawk printf番号と切り上げ


20

私は数字をprintfする必要がありますが、与えられた幅と丸みを帯びています(awk!で)

%10s

私はこれを持っていますが、どうにかして接続する必要%dがありますが、私が行うすべてのものは、awkにはあまりにも多くのパラメータになります(私はより多くの列があるため)。

回答:


27

これを試すことができます:

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

フォーマットオプションには2つの部分があります。

  • 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必要?
アビナッシュラジ

あなたの唯一のステートメントがBEGINブロック内にある場合、そうではありません。私は最初に正常な身体の表現でテストしました。ありがとう、@ Gnouc。
アンドレアスヴィーゼ

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.