今回は数値などを指定した形式(フォーマット)するprintfコマンドです。printfコマンドを使えば整数を小数値にしたり、表示文字の整形などを簡単に行う事ができます。C言語にも同じprintf()がありますので、すでにC言語を知っている(使ったことがある)のであれば、すぐに理解できるでしょう。もちろん、知らなくても問題ありません。与えられたパラメーターを整形して出力するだけなので難しくはありません。
今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。
まずはマニュアルを表示
まず最初にmac printfとしてマニュアルを確認してみましょう。macOS (Ventura13.5,zsh) の場合、以下のようになります。ChatGPTや検索して出てくる結果などを参考にするのも構いませんが、まずはざっと目をマニュアルに目を通しておくと良いでしょう。
man printf
整数値を表示
printfコマンドはechoコマンドに似ています。まず、簡単なところで整数値を表示してみましょう。ptinfコマンドの最初のパラメーターにはフォーマット指定子を書きます。整数値の場合、符号付きの10進数であれば%dを書きます。printfで表示する数値や文字などのパラメーターはフォーマット指定子の後に半角空白で区切って列記します。
以下のようにすると123の数値が表示されます。フォーマット指定子内の\nは改行を示します。
printf '%d\n' 123
%dの場合、符号付整数なので以下のように負数を指定することもできます。ちなみに%uで符号なし整数値を出力できます。
printf '%d\n' -123
シングルクオーテーションでなくダブルクオーテーションで囲むとシェル展開が行われるので注意してください。例えば以下のように変数Aに値を代入しておき、シングルクオーテーションの場合とダブルクオーテーションでの結果を見れば一目瞭然でしょう。
A=456
printf '%d\n$A\n' 123
A=456
printf "%d\n$A\n" 123
4桁の整数値に揃えて表示
数値の表示で需要が多いのが桁数を揃えるというものです。0で埋める場合はゼロパディングと呼ばれることもあります。
整数値を4桁に揃えて表示するには以下のように指定します。
printf '%04d\n' 12
%04dの0が桁数不足の時に埋める文字になります。その直後に続く数値が数値の桁数を示します。以下のようにすると8桁で数値が揃えられます。
printf '%08d\n' 12
0でなく空白で埋める場合は0の代わりに空白を指定するか何も指定しないようにします。
printf '% 8d\n' 12
printf '%8d\n' 12
符号をつけて桁数を指定する場合は以下のように+記号を指定します。
printf '%+08d\n' 12
printf '%+08d\n' -12
数値が複数ある場合は2番目のパラメーター以後に半角空白で区切って指定します。すると、フォーマットに従って数値が表示されます。
printf '%08d\n' 5 96 314 7890
小数値を表示
次に小数値を表示してみましょう。まず、先ほどまで指定していた%dを指定してみるとmacOS+zshでは小数点以下が四捨五入されずにカットされて表示されるのがわかります。ラズベリーパイ(bash)ではエラーが表示され、その下の行に整数値が表示されます。2>/dev/nullのようにエラーだけ表示しないように処理してしまうこともできますが、よいとは言えないでしょう。
printf '%d\n' 12.9345
小数値を表示するには%fを指定します。以下のように指定すると小数点以下まで表示されます。
printf '%f\n' 12.9345
ただし上記のように%fとだけ指定すると小数点以下第6位まで表示されているのがわかります。表示する小数点以下を指定するには%とfの間に.2のようにピリオドと数値を指定します。例えば以下のように指定すると小数点以下第2位までの表示になります。なお、指定した数値によっては四捨五入されるので注意してください。
printf '%.2f\n' 12.9345
小数点以下の表示桁数を増やすと以下のようになります。(小数点以下第10位まで)
文字列を表示
printfは数値だけでなく文字列も表示できます。また、文字列と数値を混在して表示することもできます。以下のようにするとSample textの文字が表示されます。
printf 'Sample text\n'
表示する文字に数値を入れ込む場合は以下のようになります。
printf '今日の降水確率は%dパーセントです\n' 75
%の記号を表示したい場合は以下のように%%を2つ列記します。
printf '今日の降水確率は%d%%です\n' 75
環境に依存してしまいますが、少し変わった指定としては表示する文字数(バイト数)を指定することができます。%.の後に表示する文字数を指定します。以下のように指定すると最初の3文字(または3バイト分)だけが表示されます。
printf '%.3s\n' '日本語どうでしょう?'
printf '%.3s\n' 'sample'
もう1つ変わった使い方として\'の後に文字を指定した場合、その文字コードを表示します。文字コードを16進数で表示したい場合は%xまたは%Xを指定します。%xは16進数の英文字が小文字になり、%Xの場合は大文字になります。