okayurisotto.net

私が好きでやったことが他の人のためにもなったらお得かも!

columnコマンドを使ってコマンドライン上でCSVやTSV形式のファイルを整形して見る

  1. 📝

はじめに

コマンドライン上で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"
      }
   ]
}