如何在每次出现正则表达式时分割文件?

如何在每次出现正则表达式时分割文件?

每次段落包含“7-04/PNLP-000001”形式的代码时,我试图让 gawk 将文本文件拆分为不同的文件。例如,如果原始文本文件包含以下内容:

Proposición no de Ley 7-04/PNLP-000009,与塞维利亚-科尔多瓦-马德里大道相关。
总统夫人
Ley 7-04/PNLP-000001 提案,涉及安达卢西亚农村中年工人的恢复和社会进步。
总统夫人

我想获得一个包含以下内容的文件:

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

你很接近:

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]...,因此,它应该与/.../.

第二个代码块将针对设置的{print > file}每条记录运行,并用作条件。filefile

此处的\n模式没有意义,因为awk依次处理的每个记录都是每行的内容(默认记录分隔符 ( RS) 是\n),因此记录永远不会包含换行符。您也不想将正则表达式锚定在这里(^$)。

我已将您的替换.+[[:upper:]]+以便更具体。例如,对于.+,它将匹配 on blah 5-10/2 blah blah €1000000。您可能需要根据您想要接受的内容进行调整PNLP

请注意,它也匹配,因为它包含与模式匹配的字符串(请参见粗体部分)。blah 1234-56/XX-1234567890 blah

我已经删除了gin,gawk因为该代码不gawk具体。但请注意,仍然有一些 awk 实现不支持上面的{2}/{6}运算符(即使这是 POSIX 要求),因此如果您知道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

相关内容