Awk-pretty-printing

提供:Dev Guides
移動先:案内検索

AWK-プリティ印刷

これまで、AWKの print および printf 関数を使用して、標準出力にデータを表示しました。 しかし、printfはこれまで見てきたよりもはるかに強力です。 この関数はC言語から借用されており、フォーマットされた出力を生成する際に非常に役立ちます。 以下は、printfステートメントの構文です-

構文

printf fmt, expr-list

上記の構文では、 fmt はフォーマット仕様と定数の文字列です。 expr-list は、書式指定子に対応する引数のリストです。

エスケープシーケンス

他の文字列と同様に、フォーマットには埋め込みエスケープシーケンスを含めることができます。 以下で説明するのは、AWKでサポートされるエスケープシーケンスです-

改行

次の例では、改行文字を使用して HelloWorld を別々の行に出力します-

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

このコードを実行すると、次の結果が得られます-

出力

Hello
World

水平タブ

次の例では、水平タブを使用して異なるフィールドを表示します-

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

上記のコードを実行すると、次の結果が得られます-

出力

Sr No   Name    Sub Marks

垂直タブ

次の例では、各フィールドの後に垂直タブを使用しています-

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

このコードを実行すると、次の結果が得られます-

出力

Sr No
   Name
      Sub
         Marks

バックスペース

次の例では、最後のフィールドを除くすべてのフィールドの後にバックスペースを出力します。 最初の3つのフィールドから最後の数字を消去します。 たとえば、最後の文字がバックスペースで消去されるため、 Field 1Field として表示されます。 ただし、 Field 4 の後に \ b がなかったため、最後のフィールド Field 4 がそのまま表示されます。

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

このコードを実行すると、次の結果が得られます-

出力

Field Field Field Field 4

キャリッジリターン

次の例では、すべてのフィールドを印刷した後、 Carriage Return を実行し、現在の印刷値の上に次の値を印刷します。 これは、最終出力では Field 4 のみが表示されることを意味します。これは、前のすべてのフィールドの上に印刷される最後のものであったためです。

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

このコードを実行すると、次の結果が得られます-

出力

Field 4

フォームフィード

次の例では、各フィールドの印刷後にフォームフィードを使用しています。

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

このコードを実行すると、次の結果が得られます-

  • 出力 *
Sr No
   Name
      Sub
         Marks

フォーマット指定子

C言語と同様に、AWKにもフォーマット指定子があります。 printfステートメントのAWKバージョンは、次の変換仕様形式を受け入れます-

%c

単一の文字を印刷します。* %c *に使用される引数が数値の場合、文字として扱われ、出力されます。 それ以外の場合、引数は文字列であると見なされ、その文字列の最初の文字のみが出力されます。

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

出力

このコードを実行すると、次の結果が得られます-

ASCII value 65 = character A

%dおよび%i

10進数の整数部分のみを出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80

%eおよび%E

[-] d.dddddde [+-] ddの形式の浮動小数点数を出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 8.066000e+01

%E *形式では、eの代わりに *E が使用されます。

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 8.066000E+01

%f

[-] ddd.ddddddの形式の浮動小数点数を出力します。

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80.660000

%gおよび%G

%eまたは%f変換のいずれか短い方を使用します。有意でないゼロは抑制されます。

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

出力

このコードを実行すると、次の結果が得られます-

Percentags = 80.66

%G *形式は、%eの代わりに%E *を使用します。

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80.66

%o

符号なしの8進数を出力します。

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

このコードを実行すると、次の結果が得られます-

出力

Octal representation of decimal number 10 = 12

%u

符号なしの10進数を出力します。

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

このコードを実行すると、次の結果が得られます-

出力

Unsigned 10 = 10

%s

文字列を出力します。

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

このコードを実行すると、次の結果が得られます-

  • 出力 *
Name = Sherlock Holmes

%xおよび%X

符号なしの16進数を出力します。* %X *形式では、小文字ではなく大文字が使用されます。

[jerry]$ awk 'BEGIN {
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

このコードを実行すると、次の結果が得られます-

出力

Hexadecimal representation of decimal number 15 = f

今%Xを使用して結果を観察しましょう-

[jerry]$ awk 'BEGIN {
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

このコードを実行すると、次の結果が得られます-

出力

Hexadecimal representation of decimal number 15 = F

%%

単一の*%*文字を出力し、引数は変換されません。

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

このコードを実行すると、次の結果が得られます-

出力

Percentags = 80%

%のオプションパラメータ

  • %*を使用すると、次のオプションパラメータを使用できます-

フィールドは width に埋め込まれます。 デフォルトでは、フィールドにはスペースが埋め込まれますが、0フラグが使用されると、ゼロが埋め込まれます。

[jerry]$ awk 'BEGIN {
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 =         10
Num2 =         20

先行ゼロ

先行ゼロはフラグとして機能し、出力にスペースではなくゼロを埋め込む必要があることを示します。 このフラグは、フィールドが印刷される値よりも広い場合にのみ効果があることに注意してください。 次の例ではこれについて説明します-

[jerry]$ awk 'BEGIN {
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 = -0010
Num2 = 00020

左揃え

式はそのフィールド内で左寄せする必要があります。 入力文字列が指定された文字数よりも少なく、左揃えにする場合、つまり、右側にスペースを追加する場合は、%の直後で数字の前にマイナス記号(–)を使用します。

次の例では、AWKコマンドの出力がcatコマンドにパイプされて、END OF LINE($)文字が表示されます。

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

このコードを実行すると、次の結果が得られます-

出力

Num = 10   $

プレフィックス記号

値が正の場合でも、常に数値の前に符号を付けます。

[jerry]$ awk 'BEGIN {
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2
}'

このコードを実行すると、次の結果が得られます-

出力

Num1 = -10
Num2 = +20

Hash

%oの場合、先行ゼロを提供します。 %xおよび%Xの場合、結果がゼロ以外の場合にのみ、それぞれ先頭の0xまたは0Xを提供します。 %e、%E、%f、および%Fの場合、結果には常に小数点が含まれます。 %gおよび%Gの場合、末尾のゼロは結果から削除されません。 次の例ではこれについて説明します-

[jerry]$ awk 'BEGIN {
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

このコードを実行すると、次の結果が得られます-

出力

Octal representation = 012
Hexadecimal representation = 0XA