2016-08-30 58 views
1

我有一个大型文本文件,其中包含一个重复数据集,其中每个条目的标题为-XXXX-和页脚$$$$。大约有20K条目,我想将它分成500个条目。在第n个分隔符实例中将文本文件拆分为多个文件

我一直在玩awk,并使用下面的命令它关闭。每个文件以-XXXX-开头,但第一个文件后面的每个文件最后都有一个部分条目。

awk "/-XXXX-/ { delim++ } { file = sprintf(\"file%s.sdf\", int(delim/500)); print > file; }" < big.sdf 

例如:

-XXXX- 
Beginning 
Middle 
End 
$$$$ 
-XXXX- 
Beginning 

我不是想每个文件,以$$$$之后结束。我在Windows上使用awk

+0

当你说“每一个文件的第一个在末端部分进入后”,你描述输入数据文件(S)或目前你所得到的输出? –

+0

我目前正在获得的输出。第一个文件在$$$$下正确切断。后续文件包含-XXXX-之后的部分条目。 注意:我发现如果我在Windows机器上的Cygwin shell中运行上述代码,我会得到正确的行为,但如果通过Windows中的命令提示符运行它,它会如上所述混淆。 – macaday

+0

这对我来说很难确定发生了什么。我再也无法访问任何Windows机器 - 这是几十年来的第一次 - 所以我不能很容易地尝试复制这个问题。你说什么听起来很奇特。文件是否以换行符结尾(Windows上的CRLF)?如果不是,那可能会导致你所看到的一些情况。 –

回答

2

因此,如果-XXXX-和$$$$之间的每组数据都是一条记录,您希望一次写入500条记录来分隔文件?看起来你需要两个计数器 - 一个用于输出文件名刚刚上升,另一个用于当前“批处理”中的记录数,该记录数可以达到500,然后在下一个批处理中重置为零。喜欢的东西:

BEGIN {fctr=1 ; rctr=0 ; file=("file" fctr ".sdf")} 
/^\$\$\$\$$/ {print > file ; rctr+=1} 
rctr==500 {fctr+=1 ; file=("file" fctr ".sdf") ; rctr=0} 
!/^\$\$\$\$$/ {print > file} 
  • 1号线设置的初始值,并与file1.sdf开始了

  • 2号线的每个记录页脚匹配,并且每次我们看到时间递增记录计数器一个(以及写出当前页脚)

  • 第3行用于当我们达到500条记录时。首先移动到下一个文件名,然后将记录数重置为零

  • 第4行用于所有常规行。只要它们发送到无论是当前文件名