人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

grepで行毎ではなく、空行を区切りとして検索結果を表示したい。
つまり、perlやawkで言うところのレコードセパレータを”¥n¥n”にして、検索結果を表示させたいということです。
現在はperlでこの処理をさせているが、遅いため、grepを直に使うことで高速化出来ないかと考えています。
grep -C オプションで、1レコード分以上の出力を抜き出しておいて、後から余計な部分を落とすとか考えましたが、簡潔な方法があれば教えてください。

●質問者: stealthinu
●カテゴリ:コンピュータ
✍キーワード:AWK grep Perl オプション レコード
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● shampoohat
●40ポイント

http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Manpage of GREP

> 現在はperlでこの処理をさせているが、遅いため、


「遅いため」ですか。。。。


下記:


grep ***** input.txt | sed ”s/$/¥n/” > output.txt


でも、駄目でしょうか? これは、


grep ***** input.txt | perl -pe ”s/$/¥n/” > output.txt


と、等価なためナンセンスな回答である可能性はあると思いながらも、perl自体のプロセスの起動に時間がかかるなどして遅いのであれば、上記のsedへの置き換えで改善しますし。。。

◎質問者からの返答

これだと抜き出した後、空行を開ける、になりませんか?

今perlでやらせている内容は、レコードセパレータを”¥n¥n”にして読み込み、そのレコード中に合致するパターンがあれば、それを出力する、という感じです。

それとも、先にsedで空行区切りまでをまとめておいて、それを検索掛ける、というアイデアでしょうか。

ただ、ちょっといろいろとやってみて、速度的に満足行くところまで自己解決できましたので、これで終了にさせていただきます。

先にgrep -Cで1レコード分をだいたい抜き出しておいてから、perlで空行区切りで読み込んで抽出、という方法です。

---

#!/usr/bin/perl

$grep=”/usr/local/bin/grep”;

$record_max_lines=20;

$/=”¥n¥n”;

$target=shift;

open( GREP, ”$grep -C $record_max_lines $target |”);

while( <GREP> ) {

print if ( /$target/ );

}

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ