我有一个文件,其中有几个文本块用空行分隔。例:
block1
block1
block2
block3
block3
我需要一个使用sed,awk或Perl的解决方案来找到第一个空白行并将前一个块重定向到另一个文件,依此类推,直到文件结束。
我在sed中有这个命令来定位第一个块,但不是其余的块:
sed -e '/./!Q'
有人可以帮助我吗?
答案 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