awkの出力を揃える

awkで文字列を綺麗に揃えて出力する方法です。

例として以下のテキストファイル(test.txt)をawkで揃えて出力します。

127.0.0.1 31times
54.67.128.111 4times

awkで出力を揃える場合はprintfを用います。

cat test.txt | awk '{printf "%20s %s\n",$1,$2}'

上記のコマンドはtest.txtの第1フィールドと第2フィールドの間にスペースを一つ入れて出力するものです。 出力結果は以下のようになります。

$ cat test.txt | awk '{printf "%20s %s\n",$1,$2}'
127.0.0.1 31times
54.67.128.111 4times

上記のコマンドをベースに出力を揃えていきます。

cat test.txt | awk '{printf "%20s %s\n",$1,$2}'

第1フィールドに対応する%sを%20sに変更しました。
これにより、第1フィールドが20文字分の文字列として右詰めで出力されます。

$ cat test.txt | awk '{printf "%20s %s\n",$1,$2}'
           127.0.0.1 31times
       54.67.128.111 4times

左の空白と第1フィールドを合わせると20文字分になっています。

右詰めだと気持ちわるいので左詰めにしてみます。

cat test.txt | awk '{printf "%-20s %s\n",$1,$2}'

今度は%20sを%-20sにしました。これで左詰めになります。

$ cat test.txt | awk '{printf "%-20s %s\n",$1,$2}'
127.0.0.1            31times
54.67.128.111        4times

第1フィールドと中央の空白が合わせて20文字分(元々間にスペースを入れているので正確には21文字分)になっています。
今度は第2フィールドのtimesの位置がばらばらで気持ちわるいので第2フィールドを右詰めで揃えてます。

cat test.txt | awk '{printf "%-20s %7s\n",$1,$2}'

先ほどと同様です。第2フィールドを7文字分として右詰めします。

$ cat test.txt | awk '{printf "%-20s %7s\n",$1,$2}'
127.0.0.1            31times
54.67.128.111         4times

これで綺麗に揃いました。