我目前正在使用Scala应用程序解析一些文件。问题是文件太大,所以它们总是在堆大小中抛出一个异常(我尝试过最大堆大小,我可以但仍然没用)。
现在,文件如下所示:
This is
one paragraph
for Scala
to parse
This is
another paragraph
for Scala
to parse
Yet another
paragraph
等等。基本上我想把所有这些文件分成10或20个,但我必须确保一个段落在结果中没有被分成两半。有没有办法做到这一点?
谢谢!
答案 0 :(得分:5)
csplit file.txt /^$/ {*}
csplit
拆分由指定模式分隔的文件。
/^$/
匹配空行。
{*}
无限期地重复先前的模式。
答案 1 :(得分:1)
每3段分开一次:
awk 'BEGIN{nParMax=3;npar=0;nFile=0}
/^$/{npar++;if(npar==nParMax){nFile++;npar=0;next}}
{print $0 > "foo."nFile}' foo.orig
每10行拆分一次:
awk 'BEGIN{nLineMax=10;nline=0;nFile=0}
/^$/{if(nline>=nLineMax){nFile++;nline=0;next}}
{nline++;print $0 > "foo."nFile}' foo.orig
答案 2 :(得分:1)
这是一个awk脚本,它将输入文件分解为batch_size
块(垃圾尾随记录分隔换行符)。将其放入文件并将其更改为可执行文件:
#!/usr/bin/awk -f
BEGIN {RS=""; ORS="\n\n"; last_f=""; batch_size=20}
# perform setup whenever the filename changes
FILENAME!=last_f {r_per_f=calc_r_per_f(); incr_out(); last_f=FILENAME; fnum=1}
# write a record to an output file
{print $0 > out}
# after a batch, change the file name
(FNR%r_per_f)==0 {incr_out()}
# function to roll the file name
function incr_out() {close(out); fnum++; out=FILENAME"_"fnum".out"}
# function to get the number of records per file
function calc_r_per_f() {
cmd=sprintf( "grep \"^$\" %s | wc -l", FILENAME )
cmd | getline rcnt
close(cmd)
return( sprintf( "%d", rcnt/batch_size ) )
}
您可以更改begin块中的batch_size
元素以调整每个输入文件的输出文件数,并且可以通过更改out=
中的incr_out()
分配来更改输出文件名本身}。
如果您将其放入名为awko
的文件中,则可以像awko data1 data2
一样运行它,并获取data2_7.out
之类的文件。当然,如果您的输入文件名具有扩展名等,则输出名称会更糟糕。
答案 3 :(得分:0)
您可以使用" split"命令,但是如果要拆分段落,可以使用这种脚本:
awk -v RS="\n\n" 'BEGIN {n=1}{print $0 > "file"n++".txt"}' yourfile.txt
将每个段落拆分为名为" file1.txt"," file2.txt"等等的文件......等等...
设置" n ++"每个" N"段落,你可以这样做:
awk -v RS="\n\n" 'BEGIN{n=1; i=0; nbp=100}{if (i++ == nbp) {i=0; n++} print $0 > "file"n".txt"}' yourfile.txt
只需改变" nbp"设置段落编号的值
答案 4 :(得分:0)
要将X个段落的文件拆分为n个(下面的{(select from tableName) asof `sym`time!(`12345;20:05:27.000)
)文件,其中X大于或等于n的某个数字将是:
10