在第一个空行之前复制所有内容

时间:2015-12-14 11:05:27

标签: perl shell awk sed grep

我有一个文件,其中有几个文本块用空行分隔。例:

block1
block1

block2

block3
block3

我需要一个使用sed,awk或Perl的解决方案来找到第一个空白行并将前一个块重定向到另一个文件,依此类推,直到文件结束。

我在sed中有这个命令来定位第一个块,但不是其余的块:

sed -e '/./!Q'

有人可以帮助我吗?

7 个答案:

答案 0 :(得分:4)

试试这行:

datastore.NewKey(..)

它会生成awk -v RS="" '{print > "file"++c".txt"}' input

答案 1 :(得分:1)

这里是awk

$ awk 'BEGIN{file="file"++cont}/^$/{file="file"++cont;next}{print>file}' infile

<强>结果

$ cat file1 
block1
block1
$ cat file2
block2
$ cat file3
block3
block3

答案 2 :(得分:1)

考虑到块之间的几个空字符串

awk '/./{if(!L)++C;print>"Out"C".txt"}{L=$0!~/^$/}' YourFile

Sed不允许使用不同的外部文件(实际上未指定数量的)作为输出

答案 3 :(得分:0)

这是Perl的解决方案

open( my $fh, '<', '/tmp/a.txt' ) or die $!;

{
    ## record delimiter
    local $/ = "\n\n";
    my $count = 1;

    while ( chomp( my $block = <$fh> ) ) {
        open( my $ofh, '>', sprintf( '/tmp/file%d', $count++ ) ) or die $!;
        print {$ofh} $block;
        close($ofh);
    }

}

close($fh);

答案 4 :(得分:0)

这是我在Perl中的解决方案:

#!/usr/bin/perl
use strict;
use warnings;

my $n     = 0;
my $block = '';
while (<DATA>) {    # line gets stored in $_
    if (/^\s*$/) {    # blank line
        write_to_file( 'file' . ++$n, $block );
        $block = '';
    } else {
        $block .= $_;
    }
}

# Write any remaining lines
write_to_file( 'file' . ++$n, $block );

sub write_to_file {
    my $file = shift;
    my $data = shift;

    open my $fh, '>', $file or die $!;
    print $fh $data;
    close $fh;
}

__DATA__
block1
block1

block2

block3
block3

输出:

$ grep . file*
file1:block1
file1:block1
file2:block2
file3:block3
file3:block3

答案 5 :(得分:0)

在Perl中执行此操作的另一种方法:

#!/usr/bin/perl
use strict;
use warnings;

# store all lines in $data
my $data = do { local $/; <DATA> };

my @blocks = split /\n\n/, $data;

my $n = 0;
write_to_file( 'file' . ++$n, $_ ) for @blocks;

sub write_to_file {
    my $file = shift;
    my $data = shift;

    open my $fh, '>', $file or die $!;
    print $fh $data;
    close $fh;
}

__DATA__
block1
block1

block2

block3
block3

答案 6 :(得分:0)

这可能适合你(GNU csplit&amp; sed):

csplit -qf uniqueFileName file '/^$/' '{*}' && sed -i '/^$/d' uniqueFileName*

或者如果你想使用默认值:

csplit -q file '/^$/' '{*}' && sed -i '/^$/d' xx*

使用:

tail -n+1 xx* # to check the results