2

ファイルがあるとします:

1Alorem
2ipsuml
3oremip
4sumZAl
5oremip
6sumlor
7emZips

A を含む行から Z を含む行にテキストを範囲で分割したい:

/A/,/Z/ {
print > "rangeX.txt"
}

この特定の入力で 2 つのファイルが得られるようにします。

1Alorem
2ipsuml
3oremip
4sumZAl

4sumZAl
5oremip
6sumlor
7emZips

問題は、広告が範囲の終わりとして一致した場合にのみ行 4 が取得されることですが、他の行に A がないため、2 番目の範囲が開始されないことです。

すべてのパターンに対して 4 行目を再度一致させる方法や、新しい範囲を開始する必要があることを awk に伝える方法はありますか?

ありがとう

4

3 に答える 3

2

Arneが指摘したように、2番目のセクションはキャッチされませんが、現在のパターンがキャッチされます。これが範囲のない代替案です。

awk 'p==0 {p= (~/A/)>0;filenr++} p==1 {print > "range"filenr".txt"; p= (~/Z/)==0; if(!p && ~/A/){filenr++;;p=1; print > "range"filenr".txt"}}' test.txt

また、3つ以上のセクションを処理します

于 2012-07-24T09:12:10.187 に答える
1

レコードを再照合する方法はありませんが、パターンのバリアントを書き込むことはオプションです。ここで、2番目の範囲パターンは、AとZを含む行からZを含むがAを含まない行に一致します。

awk "/A/,/Z/ {print 1, $0} (/A/ && /Z/),(/Z/ && !/A/) {print 2, $0}"

プリント:

1 1Alorem
1 2ipsuml
1 3oremip
1 4sumZAl
2 4sumZAl
2 5oremip
2 6sumlor
2 7emZips

あなたのサンプルは少し合成なので、その解決策があなたの本当の問題に合うかどうかはわかりません。

于 2012-07-24T09:06:16.713 に答える
1

最初の範囲の最後の行を変数に保存し、その変数を次の範囲とともに 2 番目のファイルに再出力するだけです。

つまり、各行をループしているだけなので、BEGIN で空の変数を定義し、毎回更新します。範囲が終了すると、変数が最後の行として保存されます。やり直す前に、その行を次のファイルに書き出します。

于 2012-07-24T08:29:13.120 に答える