前回に続き数値などを指定した形式(フォーマット)するprintfコマンドです。他のコマンドと組み合わせることでデータの生成・整形もできます。

今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。

ファイル内の数値データをフォーマットする

 まず、ファイル内にある数値データをフォーマットして出力してみましょう。printfはパラメーターにファイルパスを指定できないため、xargsを使ってファイルの内容を渡すことにします。
 ここでは1.txtというテキストファイルを用意しました。1行に1つの整数値が書かれています。

・1.txtの内容

123
4
56
7890

これらの数値を8桁に揃えて表示するには以下のように指定します。以下のようにxargsを使うことで1.txtの内容が標準出力に流れ、その内容がprintfのパラメーターとして渡されます。

cat 1.txt | xargs printf '%08d\n'

結果をファイルとして保存する場合はリダイレクト(>)を使います。以下のように指定すると1a.txtというファイル名で結果が保存されます。

cat 1.txt | xargs printf '%08d\n' > 1a.txt

整数値を小数値(小数点以下2桁表示)として変換出力する場合は以下のように指定します。

cat 1.txt | xargs printf '%.2f\n'

上記の場合で十分な場合もありますが、桁数を揃え右揃えにして見た目をよくしたい場合もあるかもしれません。
そのような場合は全体の桁数と小数点以下の桁数の両方を指定します。以下のようにすると全体で8桁、小数点以下は第2位までの表示になります。

cat 1.txt | xargs printf '%8.2f\n'

複数列の数値データをフォーマットする

 次に1行に複数の数値がある場合です。数値はタブまたは半角空白で区切られているものとします。ここでは2.txtとして以下の内容のファイルを用意しました。

・2.txt

123 98 567 
4 7 11
56 781 657
7890 8760 31415

このデータを8桁で小数点以下2桁にする場合は以下のようにします。

cat 2.txt | xargs printf '%8.2f\n'

1データごと改行していますが、改行でなくタブ区切りにしたい場合は\nの代わりにタブコードを示す\tにします。

cat 2.txt | xargs printf '%8.2f\t'

CSV形式のように,区切りにする場合は以下のように指定します。

cat 2.txt | xargs printf '%.2f,'

今度は小数点を含むデータを整数値のみにしてみましょう。数値が書かれているデータファイル(テキストファイル)は以下のようになっています。

・3.txt

18.4
18.9
16.0
9.2
6.1
-0.3
-6.5
-1.2
0.01
3.8

この数値データを整数化するには以下のように指定します。%fでなく%dを指定するとエラーが出力されることがあります。

cat 3.txt | xargs printf '%.f\n'

3桁で綺麗に列を揃えたい場合は以下のように指定します。

cat 3.txt | xargs printf '% 3.f\n'

パイプを使いたくない場合はを使って実行結果をパラメーターとして指定することもできます。

printf '% 3.f\n' cat 3.txt

番号を振って出力する

 先ほどの3.txtのデータの前に番号を振ってみましょう。まず、シリアル番号を表示するにはseqを使います。以下のように入力すると1から10までの数値が表示されます。

seq 10

4桁で数値を揃えたい場合は以下のように指定します。

seq -f %04g 1 10

ただ、せっかくprintfを使ってきたのでseqとprintfを組み合わせてみましょう。以下のようにすると4桁での表示になります。

seq 10 | xargs printf '%04d\n'

この後の処理のために以下のようにリダイレクトを使ってnum.txtとしてファイルに書き出しておきます。

seq 10 | xargs printf '%04d\n' > num.txt

次は3.txtの前に4桁の番号をつけます。このような列を追加する場合、pasteコマンドを使えば簡単です。pasteのパラメーターに列を連結する順番でファイル名(ファイルパス)を指定します。以下のようにすると最初の列が4桁の番号、次が3.txtの内容の数値データになります。

paste num.txt 3.txt

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら