是否有一个班轮分隔符的每一个第N次出现后,分割文本文件到块/块?
例如:下面的分隔符是“+”
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
...
有几百万的条目,等等分隔符的每次出现分裂“+”是一个坏主意。 我想拆就,说的分隔符“+”每50,000个实例。
Unix命令“分裂”和“则csplit”只是似乎并没有做到这一点...
是否有一个班轮分隔符的每一个第N次出现后,分割文本文件到块/块?
例如:下面的分隔符是“+”
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
...
有几百万的条目,等等分隔符的每次出现分裂“+”是一个坏主意。 我想拆就,说的分隔符“+”每50,000个实例。
Unix命令“分裂”和“则csplit”只是似乎并没有做到这一点...
使用awk
你可以:
awk '/^\+$/ { delim++ } { file = sprintf("chunk%s.txt", int(delim / 50000)); print >> file; }' < input.txt
更新:
不包括分隔符,试试这个:
awk '/^\+$/ { if(++delim % 50000 == 0) { next } } { file = sprintf("chunk%s.txt", int(delim / 50000)); print > file; }' < input.txt
在next
关键字使awk制止此记录和并前进到下一个(线)的处理规则。 我也改变了>>
以>
因为如果你运行它一次,你可能不希望追加旧块文件的更多。
这是不是很辛苦在Perl做,如果你不能找到合适的替代品(和它会执行得很好):
#!/usr/bin/env perl
use strict;
use warnings;
# Configuration items - could be set by argument handling
my $prefix = "rs."; # File prefix
my $number = 1; # First file number
my $width = 4; # Number of digits to use in file name
my $rx = qr/^\+$/; # Match regex
my $limit = 3; # 50,000 in real case
my $quiet = 0; # Set to 1 to suppress file names
sub next_file
{
my $name = sprintf("%s%.*d", $prefix, $width, $number++);
open my $fh, '>', $name or die "Failed to open $name for writing";
print "$name\n" unless $quiet;
return $fh;
}
my $fh = next_file; # Output file handle
my $counter = 0; # Match counter
while (<>)
{
print $fh $_;
$counter++ if (m/$rx/);
if ($counter >= $limit)
{
close $fh;
$fh = next_file;
$counter = 0;
}
}
close $fh;
这远远不是一个班轮; 我不知道这是否是一个值得与否。 应配置的项目被分组在一起,并且可以通过命令行选项来设置,例如。 你可以结束了一个空文件; 你可以发现这一点,如果有必要将其删除。 你需要一个第二计数器; 现有一个是“一致计数器”但你也会需要一个行计数器,如果行计数器的为零你删除的最后一个文件。 你还需要会的名称,即可将其删除...繁琐,但并不难。
得到输入(您的样本数据的基本上一分式两份),从输出repsplit.pl
(重复分裂)为如下所示:
$ perl repsplit.pl data
rs.0001
rs.0002
rs.0003
$ cat data
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
$ cat rs.0001
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
$ cat rs.0002
entry 4
some more
+
entry 1
some more
+
entry 2
some more
even more
+
$ cat rs.0003
entry 3
some more
+
entry 4
some more
+
$
使用的Perl和+
作为在一个简明的“单行” 输入分离器 :
如果你想要做的$_ > newprefix.part.$c
就像在您的评论中指出:
$ limit=50000 perl -053 -Mautodie -lne '
BEGIN{$\=""}
$count++;
if ($count >= $ENV{limit}) {
open my $fh, ">", "newprefix.part.$c";
print $fh $_;
close $fh;
}
' file.txt
$ ls -l newprefix.part.*