適切な代替手段が見つからない場合、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;
それはワンライナーではありません。それがメリットかどうかはわかりません。構成する必要がある項目はグループ化されており、コマンド ライン オプションなどを使用して設定できます。空のファイルになってしまう可能性があります。それを見つけて、必要に応じて削除できます。2 つ目のカウンターが必要です。既存のものは「一致カウンター」ですが、行カウンターも必要です。行カウンターがゼロの場合は、最後のファイルを削除します。また、名前を削除できるようにする必要があります...手間がかかりますが、難しくはありません。
入力 (基本的にはサンプル データの 2 つのコピー) を与えると、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
+
$