每次段落包含“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}
每条记录运行,并用作条件。file
file
此处的\n
模式没有意义,因为awk
依次处理的每个记录都是每行的内容(默认记录分隔符 ( RS
) 是\n
),因此记录永远不会包含换行符。您也不想将正则表达式锚定在这里(^
和$
)。
我已将您的替换.+
为[[:upper:]]+
以便更具体。例如,对于.+
,它将匹配 on blah 5-10/2 blah blah €1000000
。您可能需要根据您想要接受的内容进行调整PNLP
。
请注意,它也匹配,因为它包含与模式匹配的字符串(请参见粗体部分)。blah 1234-56/XX-1234567890 blah
我已经删除了g
in,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