私が知っている限り、すべてのUNIXテキスト処理ユーティリティは一度に1行ずつ読み込み、その行で操作を実行します。
興味のある複数のタグを含む1行のテキストを含む巨大なファイルがあります。
ファイルの内容は次のように考えることができます。
A.*B.*Cが発生するたびに、(AとB)と(BとC)の間に2つの文字列を取得したいと思います。この例では、私が望む出力は次のとおりです。
xzxzx
zxxxzzzz
どうすればいいですか?
編集:申し訳ありません。明確に説明できませんでした。 A、B、Cは、正規表現でのみ識別できる長い文字列です。
答え1
awk
、、、、perl
その他の方法を使用すると、興味深いsed
答えがたくさん得られると確信しています。以下は、tr
この問題を解決する方法を知っている問題に戻す非常に簡単なオプションです。つまり、1行でパターンを見つけることです。
$ tr 'C' '\n' <test.file | sed -n 's/.*A\(.*\)B\(.*$\)/\1 \2/p'
このtr 'C' '\n'
コマンドは、入力のすべての「C」を改行文字に変換します。したがって、AとBの間、Bと行の終わりの間のテキストを出力するコマンドでパイプを接続する必要があります。
A、B、Cが単純な文字ではなく正規表現である場合は、次のことを試してください。
sed -e 's/C/\n/g' < test.file | sed -n 's/.*A\(.*\)B\(.*\)/\1 \2/p'
これは同じ基本的なアイデアを使用しますが、sed
改行を生成するために使用されます。
答え2
答え3
ラインがメモリに入ることができる場合、Perlのスプリット機能を再利用すると問題が解決します。それ以外の場合は、(Perl sysread関数を使用して)ファイルをチャンクとして読み込み、上記のように各チャンクを個別に処理して、目的の文字列がチャンク境界にまたがるようにします。