columnコマンドを使ってコマンドライン上でCSVやTSV形式のファイルを整形して見る
公開日:
はじめに
コマンドライン上でCSVを表組みされた状態で見たい場面があったので、その方法を調べました。
CSVとTSVについて
CSVとはデータをプレーンテキストなファイルに保存するときに使われるフォーマットのひとつで、各項目がコンマ記号によって区切られています。例えば下に示すようなものはCSV形式のファイルのコンテンツとして正しいものです。
user_id,user_name,age
1,alice,10
2,bob,15
3,charlie,20
TSVとは、区切り文字としてタブ文字を使ったCSVの亜種とも言える形式です。スプレッドシートへ簡単に移植できるので個人的に好きです。
columnコマンド
The column utility formats its input into multiple columns.
man column
より
column
コマンドは、入力された文字列をいい感じに複数カラムに分けて表示するものです。
column --table --separator=',' filename.csv
column --table --separator=$'\t' filename.csv
user_id user_name age
1 alice 10
2 bob 15
3 charlie 20
なおこのやり方は、区切り文字のエスケープには対応していません。対応しようとするとパーサーを書かなければならないと思われます。それはCLIでやることではありません。
ヘッダーの扱い
CSVファイルでは1行目にヘッダーがあることがありますが、column
コマンドだけではそれを認識してくれません。一応column
コマンドには--table-columns
というカラムに名前を付けるオプションがありますので、それを使うことになるでしょう。
FILENAME='filename.csv'
SEPARATOR=','
cat $FILENAME | tail --lines=+2 | column --table --separator=$SEPARATOR --table-columns=`cat $FILENAME | head --lines=1 | sed 's|'$SEPARATOR'|,|g'`
おわりに
column
コマンドにはJSONとして結果を出力する--json
オプションなんかもあって楽しいです。
{
"table": [
{
"user_id": "1",
"user_name": "alice",
"age": "10"
},{
"user_id": "2",
"user_name": "bob",
"age": "15"
},{
"user_id": "3",
"user_name": "charlie",
"age": "20"
}
]
}