2010年2月13日土曜日

Unixシェルでn行目までを無視する方法

あるECサイトの管理画面で出力されたCSVをKGMODで取り込んで処理するプログラムを開発中。困ったことに、そのCSVの頭には作成日が入るために、そのままではKGMODでは取り込めない。

# created 2010/10/10 by xxxx
date,product,price
2009/12/01,P001,10000
2009/12/02,P201,52000
...

最初はgrepで#から始まる行(^#)を無視(-v)してからkgmodに取り込んだのだが、わざわざ全件パターンマッチするなんて美しくない。1行目だけを効率的に無視する方法はないかと思案した。

最初はheadとtailコマンドを使って特定の行のみを表示する方法を考えたのだが、この場合はCSVの行数を予め調べておく必要があるので、今回は使えない。(わざわざwc -lするのは効率が良くない)

いろいろGoogleで検索をかけてみると、awkなら簡単にできそうだということに気づく。

# cat data.csv | awk 'NR>1'

また、sedでも同じことができることに気づく。

# cat data.csv | sed -n '2,$p' 

ということは、Perlのワンライナーも使えるかも、ということに気づく。

# cat data.csv | perl -wnl -e '$. > 1 and print;'

個人的にはawkの書式が分かりやすいと思うけど、今更sedやawkという時代でもないので、perlを使うことにした。

0 件のコメント:

コメントを投稿