Bash:只用空行在Linux中拆分10个文件

时间:2014-03-26 22:19:48

标签: linux bash file scala split

我目前正在使用Scala应用程序解析一些文件。问题是文件太大,所以它们总是在堆大小中抛出一个异常(我尝试过最大堆大小,我可以但仍然没用)。

现在,文件如下所示:

This is
one paragraph
for Scala
to parse

This is
another paragraph
for Scala
to parse

Yet another
paragraph

等等。基本上我想把所有这些文件分成10或20个,但我必须确保一个段落在结果中没有被分成两半。有没有办法做到这一点?

谢谢!

5 个答案:

答案 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