csel -- Easier interface than cut/AWK to handle TSV/CSV input,
with the options such as -p(Printing)/-d(Deleting)/-h(moving to Head)/-t(moving to Tail).
AWK言語やコマンドcutよりも列の抽出を簡単に書けるコマンドラインを提供する。
概要:
TSVファイル等の指定された列を表示する。Specifying the column(s) by
-p で表示する列を指定する。 for printing by -p
-d で表示しない列を指定する。for hiding by -d
-h で先頭(各行の左部分に表示する列を指定する。 for moving the leftmost by -h
-t で末尾(各行の右部分に表示する列を指定する。 for moving the rightmost by -t
利用例 :
$0 -p 5..9,2 -d 6..8 ; # 5列目から9列目の後に2列目を表示するが、ただし6,7,8列目は省く。
$0 -p -1 ; # 最後から1列目のみを表示
他のオプション :
-= : データの1行目に記載された列名で指定する。-= を用いない場合は列指定は,左からの1から始まる番号になる。Utilizes the 1st line as a list of column names.
-0 str : 存在しないセルを指定したときに表示する文字列。未指定だと空文字列。
-r : 存在しないセルを指定したときは、その時の入力行が横に無限に周期的につながっていると仮定して、指定位置を取り出す。
-i STRING ; 入出力の区切り子の指定。-i '' とすると一文字ごとに処理。未指定ならタブ文字。
-n : 列に番号を付与する。
-~ : 列の順番を逆転して、元に戻したい時に使う。 $0 -t3 | $0 -~ -t3 のように使う。5列に対して $0 -~ -p3,4,2,1,5 のような使い方をする。
-R 0 ; Windows形式の改行に合わせて通常s/\r$//を施しているが、それが不都合な場合もあるので(さらに高速化したいとか文字化けとか) -R0で解除。
--help : この $0 のヘルプメッセージを出す。 perldoc -t $0 | cat でもほぼ同じ。
--help opt : オプションのみのヘルプを出す。opt以外でも options と先頭が1文字以上一致すれば良い。
補足 :
- 列番号は左の列から数える。1始まりである。The leftmost column is numbered "1(one)". Not "0(zero)"
- 列番号を負の数で指定すると、末尾から数える。 The rightmost column is numbered "-1".
- 範囲を指定することもできる。たとえば、-p 2..5 とすると2列目から5列目のみ表示する。 5..2 とすると、逆順になる。 ".." means range.
開発上のメモ :
* -i の指定は正規表現と見なされるが、入力のsplitにも出力のjoin にも用いるので、注意が必要。
* 引数で指定できる列に関して、範囲演算 .. に加えて / で一定長の飛び飛びも定義できるようにしたい。
* AWKのコマンドを生成するようにせよ。
このプログラムに求められる要件 (テストにも含めたい) :
* 十分高速に動作すること。gawk と同じ程度が目標だった。cut よりは高速にしたかった。。
* cutより早くするのが厳しければ、 同じファイルを Unix コマンドsort の半分程度であること。
* $0 -p -1 できちんと最後の列を表示すること。
* 列数が行毎に異なる入力データでも、きちんと動作すること。
# このブログラムは 2016年2月9日(火)から表形式データに対する道具作りの一環として、下野寿之が作成したものである。