2004年05月27日

perl もいいけど・・・。

やっと perl をそこそこ利用できる (決して「使える」ではありません)
ようになってきました。
perl はとってもとっても便利です。
ですが、やっぱりこれはプログラム言語です。
ある程度完成されたロジックを実行するのに向いたものだと思います。
テキストデータをインタラクティブに扱うには、perl は「悪くない」程度でしかありません。
人がデータを確認しながら修正するにはもうちょっと、インタラクティブ性の
強いツールの方が便利です。

さて、テキストデータを処理する上でもっとも
インタラクティブ性の強いツールといえば、なんでしょう?
すぐに思い浮かばないかもしれませんが、最強は editor だと思います。
聞けば納得でしょ?

じゃぁ、その次にインタラクティブ性の強いツールは?
と聞かれると、私は UNIX/Linux のシェルで使うコマンド群だと思います。
つまり、 sed awk grep uniq sort cat head tail tr などこの辺のコマンド。
単機能 (といえるほど機能は低くありませんが) を一つずつ実行しながら、
実行結果を確認できるうえ、パイプでつなぐことで、
だんだん処理を進行させていくことができる、
という点で大変便利です。

ってわけで、どのようなデータが入っているか、
完全に想定しきれていないテキストデータをいじるには、
通常のコマンドがお薦めです。
実行しながら、結果を逐一確認しやすいですし、便利便利♪

さて、今日はこの便利なコマンド群を使いながら、
UNIX 上で組織改正作業を行っていました。
ディレクトリの情報を更新した上で、
その更新内容を、ディレクトリを利用するサーバ郡に、配布する。
という作業です。
簡単そうに聞こえますけど、
「日次でのバッチ更新機能」というものに問題が起こらないように、
データの整合性に注意しながらの更新ですのでかなり大変です。

どれぐらい大変かというと、5 時間かかるぐらい。(具体的っ!)

謎解きみたいで楽しいことは楽しいんですが、
やっぱり、今日は疲れました。

そして、その作業の中で一つだけ考えることがありました。
"abc" という文字列と "bcd" という文字列両方を含む行 以外
というのはどうやって表現するのが一番楽だと思いますか?

awk '{ if( $0 ~ /abc/ && $0 ~ /bcd/ ){}else{ print $0 } }'
とか、
perl -e 'while( <> ){ if( /abc/ and /bcd/ ){}else{ print; } }'
とかできますが、
( if の論理式を反転させずに、空文をつかって else で処理するのは私の好みです )
個人的には
grep -v abc ファイル名 > tempfile
grep abc ファイル名 | grep -v bcd >> tempfile
なんかが楽で好きかも知れません。 (データ順序に対してルーズな場合のみ)

なんか、ほかにかっこいいほう方があったら、
コメントでぜひ教えてください♪

Posted by k-square : 2004年05月27日 21:17 | Linux/UNIX
コメント
コメントする









名前、アドレスを登録しますか?