第 2 回 - フィルタ,シェルスクリプトの基礎(2)

[10/09, 2009 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 4】

例題 4

データがカンマで区切られた形式(CSV形式)のファイルがあるとき, そのファイルをタブ区切り形式に変換して出力しなさい.

解答例

     sed 's/,/\t/g' < foo.csv
foo.csv は処理対象のファイルを意味する

解説

この例題でやろうとしていることは, 入力として与えられたファイルの内容を調べ, その中の カンマ(,)をタブ文字(\t)に置き換えて出力 するというものである.
この目的を達成する方法はいくつかあるが,ここでは sed (stream editor) コマンドを利用した方法を紹介する.

sed とは,その名前が表すように「エディタ」である. ただし,emacs や vi のようにユーザと(コマンドを通じて)対話的に編集するのではなく, あらかじめ与えておいたコマンドを使って一気に編集してしまうものである.
正確な言い方ではないが, 特定の編集操作だけを決め打ちで,一気にやってしまう コマンドだと思えばよい.
上の解答例では,「カンマ(,)をタブ文字(\t)に書き換える」 という編集作業だけを一気にやってくれるようなイメージである.

sed で文字列の書き換えを行うには以下のように記述する:


     sed  's/書き換え前/書き換え後/g'  < 対象ファイル

ただし,対象ファイルを省略した場合は代りに標準入力が使用される.
なお,この書き換えは一行ずつ実行され,出力されていく.
正しくは,最初の s が置換(substitute)を意味する. また,最後の g は global の略で,置換を対象全体で実施することを意味する. 仮に g を書かなかった場合,上の書き換えは一行で一回しか行われない.

同様の処理は tr コマンドや awk コマンドでも可能であるが, ここでは割愛する. 興味があれば各自で調べてもらいたい. 特に awk は sed 以上に高度なデータ処理が可能となっている.