正規表現が現れるたびにファイルを分割する方法は?

正規表現が現れるたびにファイルを分割する方法は?

段落に「7-04/PNLP-000001」形式のコードが含まれるたびに、テキストファイルを別のファイルに分割するようにgawkを試しています。たとえば、元のテキストファイルに次の内容が含まれているとします。

Seville-Córdoba-Madrid Avenueに関連するProposición no de Ley 7-04/PNLP-000009。アンダルシア農村地域中年労働者のリハビリテーションと社会の発展に関するLey
大統領夫人の提案7-04 / PNLP-000001。大統領の妻

以下を含むファイルを取得したいと思います。

Seville-Córdoba-Madrid Avenueに関連するProposición no de Ley 7-04/PNLP-000009。
大統領の妻

別の内容は次のとおりです。

Ley 7-04/PNLP-000001 アンダルシアの田舎地域の中年労働者のリハビリテーションと社会の発展に関する提案。
大統領の妻

このコードを使用して実行しようとしています。

gawk '
        /^\n.+[0-9]\-[0-9]{2}\/.+\-[0-9]{6}$/
        {if (p) close (p)
        p = sprintf("split%05i.txt", ++i) }
            { print > p; }
    ' input.txt

ただし、これはコンテンツに関係なく、1行に1つのファイルのみを生成します。私が間違っていることを知っている人はいますか?よろしくお願いします!

答え1

ほぼ完了しました:

awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ {
       if (file) close (file)
       file = sprintf("split%05i.txt", ++i)
     }
     file {print > file}' input.txt

パターンに一致する{ if... }行に対してコードブロックを実行しようとしているので。[0-9].../.../

2番目のコードブロックは{print > file}すべてのレコードセットに対して実行され、条件として使用されます。filefile

ここでパターンは、順番に処理される各レコードが各行の内容なので(基本レコード区切り記号()はです)、レコードに改行文字が含まれないため\n意味がありません。また、ここに正規表現を固定したくありません(および)。awkRS\n^$

.+より具体的に説明するためにあなたのものを置き換えました[[:upper:]]+。たとえば、の場合.+と一致しますblah 5-10/2 blah blah €1000000。受け入れたいものに応じて調整が必要な場合がありますPNLP

また、パターンに一致する文字列が含まれているため、一致することに注意してください(太字で表示)。blah 1234-56/XX-1234567890 blah

コードが具体的ではないため、ginを削除しました。ただし、上記の/演算子をサポートしていないいくつかのawk実装がまだあることに注意してください(POSIX要件にもかかわらず)。それが利用可能であることを知っている場合は、それを使用して機能していることを確認することをお勧めします。gawkgawk{2}{6}gawk

答え2

私はそうします:
perl -ne 'my $fh="/dev/stdout"; if(/7-04\/PNLP-(\d+)/) { close $fh; open($fh,">/path/to/outputfiles/file$1"); } ; print $fh $_;' < /path/to/inputfile

関連情報