Bashシェルスクリプトでcolumnコマンドを使って出力内容を表として整形する
はじめに
先日 Gibo のソースコードを見ていたときに出力内容を表形式で表示させる方法が参考になったので整理しました。
column
というコマンドを利用します。
column
コマンドはよく使っていたのですが、知らなかったオプションを知ることができたので紹介しておきます。
検証環境
標準入力の列の位置を揃える
column -t
のように、 -t
オプションを追加することで列の位置を揃えた表として出力できます。
「4行x3列」 の簡単なデータファイルを作成し、これを操作してみます。
ランダムな大小の数値が不規則に並んでいます。
このファイルに対して column -t
コマンドを実行します。
きれいに整形されました。
ちなみに -o
オプションを指定することで任意の区切り文字を指定可能です。
Vimでファイルを開いている場合、Visualモードで選択し :'<,'>!column -t -o '|'
コマンドを実行すれば、Markdownを記述しているときに便利ですね。
CSVの列の位置を揃える
CSVのような特定の文字列でカラムが区切られているデータを表として出力してみます。
sortコマンドでCSVファイルをソートする場合はソート列の指定方法に注意 | ゲンゾウ用ポストイット でも利用したダミーデータ生成サービスを利用してCSVデータを作成し、表形式で出力してみます。
column -t -s ,
というように、 -t
オプションに加えて -s
で列の区切り文字を指定します。
ここではカンマ区切りですので -s ,
を指定します。
先程同様、列の位置が整えられて見やすく出力されています。
対象データを特定の列数で折り返して出力する
Gibo で使われていた機能がこちらです。
「1行 x 1列」で出力されるようなデータを「1行 x N列 」の表形式に出力します。
「1行 x 1列」では表示しきれないデータを1スクリーンに表示させることで閲覧性を高められます。
具体例を見ていきましょう。seq
コマンドに開始値と終了値を指定して、数値の連番を出力させてみます。
「1〜20」を出力させると以下のように20行として出力されます。
column -x
を使うと、各行の内容をいくつかまとめて1行にしてくれます。
以下の例では10行を1行にまとめて出力されています。
デフォルトでは各列は タブ (8文字幅)で区切られます。(先に取り上げた column -t
コマンドの場合は「タブ」ではなく1個以上の「半角スペース」で区切られる点に違いがあります。)
また、 各行 の最大幅は 80文字 となっており、これを越えると予測された場合に折り返されます。
上記例では 各列 の幅がタブ込で8文字幅となっているため、 最大幅80文字 / 8文字幅 = 10列
となり10列表示可能です。
表示する列数を変更する
-c
オプションで最大幅を指定可能です。
12列で表示したい場合には以下のようにオプションを指定します。
各行の最大幅80文字を変更するためのもう一つの方法として、環境変数 COLUMNS
の値を設定する方法があります。
ただし、どうも column
コマンドを実行するとこの環境変数の値が別の値に上書きされてしまうようです。
(コマンドを実行しているコンソール幅の実値で上書きされている?)
ひとこと
ひとのソースコードを読むと学びが多いですね。
ディスカッション
コメント一覧
まだ、コメントがありません