つよく、やさしく、泥臭く生きていくブログ

日常とポエムと、ときどき技術

columnコマンドが便利そう

columnコマンドが手軽に便利だった。

ちょっとperlでゴリゴリっと処理して画面に出力して、| tee でログファイルに書くっていうのちょくちょく使うんだけど、実は画面出力を見やすくするために、printするところで地道に整形(のようなこと)をしている。
でもそれって前読んだUNIXという考え方的には良くないなと思った。
人間にとっての見た目よりも、単純な形式で出力するだけのスクリプトにしておいて、人間にとっての見た目は

$ ./script.pl | tee hoge.log | column -t

ってするのがベストなんじゃないかと思った。

以下、覚え書き

$ cat hoge.txt
hoge1
hoge2
hoge3
hoge4
hoge5
hoge6
hoge7
hoge8
hoge9
hoge10
hoge11

こんな場合は

$ cat hoge.txt | column -c 30
hoge1   hoge5   hoge9
hoge2   hoge6   hoge10
hoge3   hoge7   hoge11
hoge4   hoge8 

-c で横幅を指定できる。
並びが縦に順番になってるのを、横に順番にしたい場合は -x をつけてこう。

$ cat hoge.txt | column -x -c 30
hoge1   hoge2   hoge3
hoge4   hoge5   hoge6
hoge7   hoge8   hoge9
hoge10  hoge11

それより便利なのがこういう場合

$ cat foo.txt
domain_name, ipaddress, comment, comment2
domain1, xxx.xxx.xxx.xxx, aaa, ii'ii
domain2, yyy.yyy.yyy.yyy, hogehoge,fooooooooooo
hoge.domain.com,     zzz.zzz.zzz.zzz, 0, 1

-s で区切り文字を指定
-t でカラム数をいい感じにしてくれる

$cat foo.txt | column -t -s ,
domain_name       ipaddress             comment    comment2
domain1           xxx.xxx.xxx.xxx       aaa        ii'ii
domain2           yyy.yyy.yyy.yyy       hogehoge  fooooooooooo
hoge.domain.com       zzz.zzz.zzz.zzz   0          1

余計なスペースがあって微妙なのでこう

cat foo.txt |column -t -s ,' '
domain_name      ipaddress        comment   comment2
domain1          xxx.xxx.xxx.xxx  aaa       ii'ii
domain2          yyy.yyy.yyy.yyy  hogehoge  fooooooooooo
hoge.domain.com  zzz.zzz.zzz.zzz  0         1

-s の指定でいい感じにできなさそうだったら前段でsedとかで区切りをいい感じに置換しておくとよさそう。