diff --git a/src/parallel b/src/parallel index 96e8bc41..a51da911 100755 --- a/src/parallel +++ b/src/parallel @@ -53,9 +53,9 @@ sub set_input_source_header($$) { for my $s (split /$delimiter/o, $line) { ::debug("init", "Colname: '$s'"); # Replace {colname} with {2} - for(@$command_ref,@Global::ret_files,@Global::transfer_files, - $opt::tagstring, $opt::workdir, $opt::results, - $opt::retries) { + for(@$command_ref, @Global::ret_files, + @Global::transfer_files, $opt::tagstring, + $opt::workdir, $opt::results, $opt::retries) { # Skip if undefined $_ or next; s:\{$s(|/|//|\.|/\.)\}:\{$id$1\}:g; @@ -480,17 +480,20 @@ sub find_header($$) { # Uses: # $opt::header # $Global::blocksize + # $Global::header # Returns: # $header string my ($buf_ref, $fh) = @_; my $header = ""; + # $Global::header may be set in group_by_loop() + if($Global::header) { return $Global::header } if($opt::header) { if($opt::header eq ":") { $opt::header = "(.*\n)"; } # Number = number of lines $opt::header =~ s/^(\d+)$/"(.*\n)"x$1/e; while(read($fh,substr($$buf_ref,length $$buf_ref,0), $Global::blocksize)) { - if($$buf_ref=~s/^($opt::header)//) { + if($$buf_ref =~ s/^($opt::header)//) { $header = $1; last; } @@ -597,6 +600,88 @@ sub cat_partial($@) { " perl -e '$script' @start_len |"; } +sub group_by_loop($) { + # Generate perl code for group-by loop + # Insert a $recsep when the column value changes + # The column value can be computed with $perexpr + my($recsep) = @_; + my $groupby = $opt::groupby; + my ($col,$perlexpr); + if($groupby =~ /^[a-z0-9_]+(\s|$)/i) { + # Column name/number (possibly prefix) + if($groupby =~ s/^(\d+)\s*//) { + # Column number (possibly prefix) + $col = $1-1; + } elsif($groupby =~ s/^([a-z0-9_]+)\s*//) { + # Column name (possibly prefix) + my $colname = $1; + my($read,$char,@line,$header); + # A full line, but nothing more (the rest must be read by the child) + do { + $read = sysread(STDIN,$char,1); + push @line, $char; + } while($read and $char ne "\n"); + # $Global::header used to prepend block to each job + $Global::header = join "", @line; + # Split on --copsep pattern + my @headers = split/$opt::colsep/, $Global::header; + my %headers; + # Numbered 0..n-1 due to being used by $F[n] + @headers{@headers} = (0..$#headers); + $col = $headers{$colname}; + if(not defined $col) { + ::error("Column '$colname' $opt::colsep not found in header",keys %headers); + ::wait_and_exit(255); + } + } + } + # What is left of $groupby is $perlexpr + $perlexpr = $groupby; + + my $loop = ::spacefree(0,'{ + local $_=COLVALUE; + PERLEXPR; + if(! defined $last) { $last = $_ } + if(($last) ne $_) { + print "RECSEP"; + $last = $_; + } + }'); + + if(defined $col) { + $loop =~ s/COLVALUE/\$F[$col]/g; + } else { + $loop =~ s/COLVALUE/\$_/g; + } + $loop =~ s/PERLEXPR/$perlexpr/g; + $loop =~ s/RECSEP/$recsep/g; + return $loop; +} + +sub group_by_stdin_filter() { + # Record separator with 119 bit random value + $opt::recend = ''; + $opt::recstart = + join "", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..20); + $opt::remove_rec_sep = 1; + my @filter; + push @filter, "perl"; + if($opt::groupby =~ /^[a-z0-9_]+(\s|$)/i) { + # This is column number/name + # Use -a (auto-split) + push @filter, "-a"; + $opt::colsep ||= "\t"; + my $sep = $opt::colsep; + $sep =~ s/\t/\\t/g; + $sep =~ s/\"/\\"/g; + push @filter, "-F$sep"; + } + push @filter, "-pe"; + push @filter, group_by_loop($opt::recstart); + ::debug("init", "@filter\n"); + open(STDIN, '-|', @filter) || die ("Cannot start @filter"); +} + sub spreadstdin() { # read a record # Spawn a job and print the record to it. @@ -1259,6 +1344,7 @@ sub options_hash() { "pipepart|pipe-part" => \$opt::pipepart, "tee" => \$opt::tee, "shard=s" => \$opt::shard, + "groupby|group-by=s" => \$opt::groupby, "hgrp|hostgrp|hostgroup|hostgroups" => \$opt::hostgroups, "embed" => \$opt::embed, ); @@ -1705,11 +1791,34 @@ sub check_invalid_option_combinations() { "--noctrlc has been retired."); ::wait_and_exit(255); } + if($opt::groupby) { + if(not $opt::pipe) { + $opt::pipe = 1; + } + if($opt::remove_rec_sep) { + ::error("--remove-rec-sep is not compatible with --groupby"); + ::wait_and_exit(255); + } + if($opt::recstart) { + ::error("--recstart is not compatible with --groupby"); + ::wait_and_exit(255); + } + if($opt::recend ne "\n") { + ::error("--recend is not compatible with --groupby"); + ::wait_and_exit(255); + } + if($opt::pipepart) { + # TODO This may be possible to do later + # Finding split points might be a bitch though + ::error("--pipepart is not compatible with --groupby"); + ::wait_and_exit(255); + } + } } sub init_globals() { # Defaults: - $Global::version = 20190422; + $Global::version = 20190504; $Global::progname = 'parallel'; $Global::infinity = 2**31; $Global::debug = 0; @@ -10811,7 +10920,7 @@ sub get($) { $self->{'len'}, ); $cmd_line->populate(); - ::debug("init","cmd_line->number_of_args ", + ::debug("run","cmd_line->number_of_args ", $cmd_line->number_of_args(), "\n"); if(not $Global::no_more_input and ($opt::pipe or $opt::pipepart)) { if($cmd_line->replaced() eq "") { @@ -12449,6 +12558,9 @@ sub main() { pipe_shard_setup(); } + if($opt::groupby) { + group_by_stdin_filter(); + } if($opt::eta or $opt::bar or $opt::shuf or $Global::halt_pct) { # Count the number of jobs or shuffle all jobs # before starting any. diff --git a/testsuite/tests-to-run/parallel-local-3s.sh b/testsuite/tests-to-run/parallel-local-3s.sh index d8eb213b..719bf615 100644 --- a/testsuite/tests-to-run/parallel-local-3s.sh +++ b/testsuite/tests-to-run/parallel-local-3s.sh @@ -312,6 +312,79 @@ par_lb_mem_usage() { memusage 100000 parallel --lb ::: 'long_line; long_line' } +par_groupby() { + tsv() { + printf "%s\t" a1 b1 c1; echo + printf "%s\t" 2 2 2; echo + printf "%s\t" 3 2 2; echo + printf "%s\t" 3 3 2; echo + printf "%s\t" 3 2 4; echo + printf "%s\t" 3 2 2; echo + printf "%s\t" 3 2 3; echo + } + export -f tsv + + ssv() { + # space separated + printf "%s\t" a1 b1 c1; echo + printf "%s " 2 2 2; echo + printf "%s \t" 3 2 2; echo + printf "%s\t " 3 3 2; echo + printf "%s " 3 2 4; echo + printf "%s\t\t" 3 2 2; echo + printf "%s\t \t" 3 2 3; echo + } + export -f ssv + + cssv() { + # , + space separated + printf "%s,\t" a1 b1 c1; echo + printf "%s ," 2 2 2; echo + printf "%s ,\t" 3 2 2; echo + printf "%s\t, " 3 3 2; echo + printf "%s,," 3 2 4; echo + printf "%s\t,,, " 3 2 2; echo + printf "%s\t" 3 2 3; echo + } + export -f cssv + + csv() { + # , separated + printf "%s," a1 b1 c1; echo + printf "%s," 2 2 2; echo + printf "%s," 3 2 2; echo + printf "%s," 3 3 2; echo + printf "%s," 3 2 4; echo + printf "%s," 3 2 2; echo + printf "%s," 3 2 3; echo + } + export -f csv + + tester() { + block="$1" + groupby="$2" + generator="$3" + colsep="$4" + echo "### test $generator | --colsep $colsep --groupby $groupby $block" + $generator | + parallel --pipe --colsep "$colsep" --groupby "$groupby" -k $block 'echo NewRec; cat' + } + export -f tester + parallel --tag -k tester \ + ::: -N1 '--block 20' \ + ::: '3 $_%=2' 3 's/^(.).*/$1/' c1 'c1 $_%=2' \ + ::: tsv ssv cssv csv \ + :::+ '\t' '\s+' '[\s,]+' ',' \ + + # Test --colsep char + # Test --colsep pattern + # Test --colsep -N1 + # Test --colsep --block 20 + # Test --groupby col + # Test --groupby 'col perl' + # Test space sep --colsep '\s' + # Test --colsep --header : +} export -f $(compgen -A function | grep par_) compgen -A function | grep par_ | LC_ALL=C sort | diff --git a/testsuite/wanted-results/parallel-local-3s b/testsuite/wanted-results/parallel-local-3s index 9dcca28f..d874d7f6 100644 --- a/testsuite/wanted-results/parallel-local-3s +++ b/testsuite/wanted-results/parallel-local-3s @@ -47,6 +47,558 @@ par_dryrun_timeout_ungroup 1000 2000 8893 par_exitval_signal ### Test --joblog with exitval and Test --joblog with signal -- timing dependent par_exitval_signal exitval=128+6 OK par_exitval_signal signal OK +par_groupby -N1 3 $_%=2 tsv \t ### test tsv | --colsep \t --groupby 3 $_%=2 -N1 +par_groupby -N1 3 $_%=2 tsv \t NewRec +par_groupby -N1 3 $_%=2 tsv \t a1 b1 c1 +par_groupby -N1 3 $_%=2 tsv \t 2 2 2 +par_groupby -N1 3 $_%=2 tsv \t 3 2 2 +par_groupby -N1 3 $_%=2 tsv \t 3 3 2 +par_groupby -N1 3 $_%=2 tsv \t 3 2 4 +par_groupby -N1 3 $_%=2 tsv \t 3 2 2 +par_groupby -N1 3 $_%=2 tsv \t NewRec +par_groupby -N1 3 $_%=2 tsv \t 3 2 3 +par_groupby -N1 3 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 $_%=2 -N1 +par_groupby -N1 3 $_%=2 ssv \s+ NewRec +par_groupby -N1 3 $_%=2 ssv \s+ a1 b1 c1 +par_groupby -N1 3 $_%=2 ssv \s+ 2 2 2 +par_groupby -N1 3 $_%=2 ssv \s+ 3 2 2 +par_groupby -N1 3 $_%=2 ssv \s+ 3 3 2 +par_groupby -N1 3 $_%=2 ssv \s+ 3 2 4 +par_groupby -N1 3 $_%=2 ssv \s+ 3 2 2 +par_groupby -N1 3 $_%=2 ssv \s+ NewRec +par_groupby -N1 3 $_%=2 ssv \s+ 3 2 3 +par_groupby -N1 3 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2 -N1 +par_groupby -N1 3 $_%=2 cssv [\s,]+ NewRec +par_groupby -N1 3 $_%=2 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 3 $_%=2 cssv [\s,]+ 2 ,2 ,2 , +par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 , 2 , 2 , +par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 , 3 , 2 , +par_groupby -N1 3 $_%=2 cssv [\s,]+ 3,,2,,4,, +par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby -N1 3 $_%=2 cssv [\s,]+ NewRec +par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 2 3 +par_groupby -N1 3 $_%=2 csv , ### test csv | --colsep , --groupby 3 $_%=2 -N1 +par_groupby -N1 3 $_%=2 csv , NewRec +par_groupby -N1 3 $_%=2 csv , a1,b1,c1, +par_groupby -N1 3 $_%=2 csv , 2,2,2, +par_groupby -N1 3 $_%=2 csv , 3,2,2, +par_groupby -N1 3 $_%=2 csv , 3,3,2, +par_groupby -N1 3 $_%=2 csv , 3,2,4, +par_groupby -N1 3 $_%=2 csv , 3,2,2, +par_groupby -N1 3 $_%=2 csv , NewRec +par_groupby -N1 3 $_%=2 csv , 3,2,3, +par_groupby -N1 3 tsv \t ### test tsv | --colsep \t --groupby 3 -N1 +par_groupby -N1 3 tsv \t NewRec +par_groupby -N1 3 tsv \t a1 b1 c1 +par_groupby -N1 3 tsv \t NewRec +par_groupby -N1 3 tsv \t 2 2 2 +par_groupby -N1 3 tsv \t 3 2 2 +par_groupby -N1 3 tsv \t 3 3 2 +par_groupby -N1 3 tsv \t NewRec +par_groupby -N1 3 tsv \t 3 2 4 +par_groupby -N1 3 tsv \t NewRec +par_groupby -N1 3 tsv \t 3 2 2 +par_groupby -N1 3 tsv \t NewRec +par_groupby -N1 3 tsv \t 3 2 3 +par_groupby -N1 3 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 -N1 +par_groupby -N1 3 ssv \s+ NewRec +par_groupby -N1 3 ssv \s+ a1 b1 c1 +par_groupby -N1 3 ssv \s+ NewRec +par_groupby -N1 3 ssv \s+ 2 2 2 +par_groupby -N1 3 ssv \s+ 3 2 2 +par_groupby -N1 3 ssv \s+ 3 3 2 +par_groupby -N1 3 ssv \s+ NewRec +par_groupby -N1 3 ssv \s+ 3 2 4 +par_groupby -N1 3 ssv \s+ NewRec +par_groupby -N1 3 ssv \s+ 3 2 2 +par_groupby -N1 3 ssv \s+ NewRec +par_groupby -N1 3 ssv \s+ 3 2 3 +par_groupby -N1 3 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 -N1 +par_groupby -N1 3 cssv [\s,]+ NewRec +par_groupby -N1 3 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 3 cssv [\s,]+ NewRec +par_groupby -N1 3 cssv [\s,]+ 2 ,2 ,2 , +par_groupby -N1 3 cssv [\s,]+ 3 , 2 , 2 , +par_groupby -N1 3 cssv [\s,]+ 3 , 3 , 2 , +par_groupby -N1 3 cssv [\s,]+ NewRec +par_groupby -N1 3 cssv [\s,]+ 3,,2,,4,, +par_groupby -N1 3 cssv [\s,]+ NewRec +par_groupby -N1 3 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby -N1 3 cssv [\s,]+ NewRec +par_groupby -N1 3 cssv [\s,]+ 3 2 3 +par_groupby -N1 3 csv , ### test csv | --colsep , --groupby 3 -N1 +par_groupby -N1 3 csv , NewRec +par_groupby -N1 3 csv , a1,b1,c1, +par_groupby -N1 3 csv , NewRec +par_groupby -N1 3 csv , 2,2,2, +par_groupby -N1 3 csv , 3,2,2, +par_groupby -N1 3 csv , 3,3,2, +par_groupby -N1 3 csv , NewRec +par_groupby -N1 3 csv , 3,2,4, +par_groupby -N1 3 csv , NewRec +par_groupby -N1 3 csv , 3,2,2, +par_groupby -N1 3 csv , NewRec +par_groupby -N1 3 csv , 3,2,3, +par_groupby -N1 s/^(.).*/$1/ tsv \t ### test tsv | --colsep \t --groupby s/^(.).*/$1/ -N1 +par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec +par_groupby -N1 s/^(.).*/$1/ tsv \t a1 b1 c1 +par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec +par_groupby -N1 s/^(.).*/$1/ tsv \t 2 2 2 +par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec +par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 2 +par_groupby -N1 s/^(.).*/$1/ tsv \t 3 3 2 +par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 4 +par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 2 +par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 3 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ ### test ssv | --colsep \s+ --groupby s/^(.).*/$1/ -N1 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby -N1 s/^(.).*/$1/ ssv \s+ a1 b1 c1 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 2 2 2 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 2 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 3 2 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 4 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 2 +par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 3 +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby s/^(.).*/$1/ -N1 +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ a1, b1, c1, +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 2 ,2 ,2 , +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 , 2 , 2 , +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 , 3 , 2 , +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3,,2,,4,, +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 2 3 +par_groupby -N1 s/^(.).*/$1/ csv , ### test csv | --colsep , --groupby s/^(.).*/$1/ -N1 +par_groupby -N1 s/^(.).*/$1/ csv , NewRec +par_groupby -N1 s/^(.).*/$1/ csv , a1,b1,c1, +par_groupby -N1 s/^(.).*/$1/ csv , NewRec +par_groupby -N1 s/^(.).*/$1/ csv , 2,2,2, +par_groupby -N1 s/^(.).*/$1/ csv , NewRec +par_groupby -N1 s/^(.).*/$1/ csv , 3,2,2, +par_groupby -N1 s/^(.).*/$1/ csv , 3,3,2, +par_groupby -N1 s/^(.).*/$1/ csv , 3,2,4, +par_groupby -N1 s/^(.).*/$1/ csv , 3,2,2, +par_groupby -N1 s/^(.).*/$1/ csv , 3,2,3, +par_groupby -N1 c1 tsv \t ### test tsv | --colsep \t --groupby c1 -N1 +par_groupby -N1 c1 tsv \t NewRec +par_groupby -N1 c1 tsv \t a1 b1 c1 +par_groupby -N1 c1 tsv \t 2 2 2 +par_groupby -N1 c1 tsv \t 3 2 2 +par_groupby -N1 c1 tsv \t 3 3 2 +par_groupby -N1 c1 tsv \t NewRec +par_groupby -N1 c1 tsv \t a1 b1 c1 +par_groupby -N1 c1 tsv \t 3 2 4 +par_groupby -N1 c1 tsv \t NewRec +par_groupby -N1 c1 tsv \t a1 b1 c1 +par_groupby -N1 c1 tsv \t 3 2 2 +par_groupby -N1 c1 tsv \t NewRec +par_groupby -N1 c1 tsv \t a1 b1 c1 +par_groupby -N1 c1 tsv \t 3 2 3 +par_groupby -N1 c1 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 -N1 +par_groupby -N1 c1 ssv \s+ NewRec +par_groupby -N1 c1 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 ssv \s+ 2 2 2 +par_groupby -N1 c1 ssv \s+ 3 2 2 +par_groupby -N1 c1 ssv \s+ 3 3 2 +par_groupby -N1 c1 ssv \s+ NewRec +par_groupby -N1 c1 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 ssv \s+ 3 2 4 +par_groupby -N1 c1 ssv \s+ NewRec +par_groupby -N1 c1 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 ssv \s+ 3 2 2 +par_groupby -N1 c1 ssv \s+ NewRec +par_groupby -N1 c1 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 ssv \s+ 3 2 3 +par_groupby -N1 c1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 -N1 +par_groupby -N1 c1 cssv [\s,]+ NewRec +par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 cssv [\s,]+ 2 ,2 ,2 , +par_groupby -N1 c1 cssv [\s,]+ 3 , 2 , 2 , +par_groupby -N1 c1 cssv [\s,]+ 3 , 3 , 2 , +par_groupby -N1 c1 cssv [\s,]+ NewRec +par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 cssv [\s,]+ 3,,2,,4,, +par_groupby -N1 c1 cssv [\s,]+ NewRec +par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby -N1 c1 cssv [\s,]+ NewRec +par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 cssv [\s,]+ 3 2 3 +par_groupby -N1 c1 csv , ### test csv | --colsep , --groupby c1 -N1 +par_groupby -N1 c1 csv , NewRec +par_groupby -N1 c1 csv , a1,b1,c1, +par_groupby -N1 c1 csv , 2,2,2, +par_groupby -N1 c1 csv , 3,2,2, +par_groupby -N1 c1 csv , 3,3,2, +par_groupby -N1 c1 csv , NewRec +par_groupby -N1 c1 csv , a1,b1,c1, +par_groupby -N1 c1 csv , 3,2,4, +par_groupby -N1 c1 csv , NewRec +par_groupby -N1 c1 csv , a1,b1,c1, +par_groupby -N1 c1 csv , 3,2,2, +par_groupby -N1 c1 csv , NewRec +par_groupby -N1 c1 csv , a1,b1,c1, +par_groupby -N1 c1 csv , 3,2,3, +par_groupby -N1 c1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby c1 $_%=2 -N1 +par_groupby -N1 c1 $_%=2 tsv \t NewRec +par_groupby -N1 c1 $_%=2 tsv \t a1 b1 c1 +par_groupby -N1 c1 $_%=2 tsv \t 2 2 2 +par_groupby -N1 c1 $_%=2 tsv \t 3 2 2 +par_groupby -N1 c1 $_%=2 tsv \t 3 3 2 +par_groupby -N1 c1 $_%=2 tsv \t 3 2 4 +par_groupby -N1 c1 $_%=2 tsv \t 3 2 2 +par_groupby -N1 c1 $_%=2 tsv \t NewRec +par_groupby -N1 c1 $_%=2 tsv \t a1 b1 c1 +par_groupby -N1 c1 $_%=2 tsv \t 3 2 3 +par_groupby -N1 c1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 $_%=2 -N1 +par_groupby -N1 c1 $_%=2 ssv \s+ NewRec +par_groupby -N1 c1 $_%=2 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 $_%=2 ssv \s+ 2 2 2 +par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 2 +par_groupby -N1 c1 $_%=2 ssv \s+ 3 3 2 +par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 4 +par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 2 +par_groupby -N1 c1 $_%=2 ssv \s+ NewRec +par_groupby -N1 c1 $_%=2 ssv \s+ a1 b1 c1 +par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 3 +par_groupby -N1 c1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2 -N1 +par_groupby -N1 c1 $_%=2 cssv [\s,]+ NewRec +par_groupby -N1 c1 $_%=2 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 2 ,2 ,2 , +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 , 2 , 2 , +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 , 3 , 2 , +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3,,2,,4,, +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby -N1 c1 $_%=2 cssv [\s,]+ NewRec +par_groupby -N1 c1 $_%=2 cssv [\s,]+ a1, b1, c1, +par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 2 3 +par_groupby -N1 c1 $_%=2 csv , ### test csv | --colsep , --groupby c1 $_%=2 -N1 +par_groupby -N1 c1 $_%=2 csv , NewRec +par_groupby -N1 c1 $_%=2 csv , a1,b1,c1, +par_groupby -N1 c1 $_%=2 csv , 2,2,2, +par_groupby -N1 c1 $_%=2 csv , 3,2,2, +par_groupby -N1 c1 $_%=2 csv , 3,3,2, +par_groupby -N1 c1 $_%=2 csv , 3,2,4, +par_groupby -N1 c1 $_%=2 csv , 3,2,2, +par_groupby -N1 c1 $_%=2 csv , NewRec +par_groupby -N1 c1 $_%=2 csv , a1,b1,c1, +par_groupby -N1 c1 $_%=2 csv , 3,2,3, +par_groupby --block 20 3 $_%=2 tsv \t ### test tsv | --colsep \t --groupby 3 $_%=2 --block 20 +par_groupby --block 20 3 $_%=2 tsv \t NewRec +par_groupby --block 20 3 $_%=2 tsv \t a1 b1 c1 +par_groupby --block 20 3 $_%=2 tsv \t 2 2 2 +par_groupby --block 20 3 $_%=2 tsv \t 3 2 2 +par_groupby --block 20 3 $_%=2 tsv \t 3 3 2 +par_groupby --block 20 3 $_%=2 tsv \t 3 2 4 +par_groupby --block 20 3 $_%=2 tsv \t 3 2 2 +par_groupby --block 20 3 $_%=2 tsv \t NewRec +par_groupby --block 20 3 $_%=2 tsv \t 3 2 3 +par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 $_%=2 --block 20 +par_groupby --block 20 3 $_%=2 ssv \s+ NewRec +par_groupby --block 20 3 $_%=2 ssv \s+ a1 b1 c1 +par_groupby --block 20 3 $_%=2 ssv \s+ 2 2 2 +par_groupby --block 20 3 $_%=2 ssv \s+ 3 2 2 +par_groupby --block 20 3 $_%=2 ssv \s+ 3 3 2 +par_groupby --block 20 3 $_%=2 ssv \s+ 3 2 4 +par_groupby --block 20 3 $_%=2 ssv \s+ 3 2 2 +par_groupby --block 20 3 $_%=2 ssv \s+ NewRec +par_groupby --block 20 3 $_%=2 ssv \s+ 3 2 3 +par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2 --block 20 +par_groupby --block 20 3 $_%=2 cssv [\s,]+ NewRec +par_groupby --block 20 3 $_%=2 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 2 ,2 ,2 , +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 , 2 , 2 , +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 , 3 , 2 , +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3,,2,,4,, +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 2 3 +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 87. Increasing to --blocksize 115. +par_groupby --block 20 3 $_%=2 csv , ### test csv | --colsep , --groupby 3 $_%=2 --block 20 +par_groupby --block 20 3 $_%=2 csv , NewRec +par_groupby --block 20 3 $_%=2 csv , a1,b1,c1, +par_groupby --block 20 3 $_%=2 csv , 2,2,2, +par_groupby --block 20 3 $_%=2 csv , 3,2,2, +par_groupby --block 20 3 $_%=2 csv , 3,3,2, +par_groupby --block 20 3 $_%=2 csv , 3,2,4, +par_groupby --block 20 3 $_%=2 csv , 3,2,2, +par_groupby --block 20 3 $_%=2 csv , NewRec +par_groupby --block 20 3 $_%=2 csv , 3,2,3, +par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 tsv \t ### test tsv | --colsep \t --groupby 3 --block 20 +par_groupby --block 20 3 tsv \t NewRec +par_groupby --block 20 3 tsv \t a1 b1 c1 +par_groupby --block 20 3 tsv \t NewRec +par_groupby --block 20 3 tsv \t 2 2 2 +par_groupby --block 20 3 tsv \t 3 2 2 +par_groupby --block 20 3 tsv \t 3 3 2 +par_groupby --block 20 3 tsv \t NewRec +par_groupby --block 20 3 tsv \t 3 2 4 +par_groupby --block 20 3 tsv \t NewRec +par_groupby --block 20 3 tsv \t 3 2 2 +par_groupby --block 20 3 tsv \t 3 2 3 +par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 --block 20 +par_groupby --block 20 3 ssv \s+ NewRec +par_groupby --block 20 3 ssv \s+ a1 b1 c1 +par_groupby --block 20 3 ssv \s+ NewRec +par_groupby --block 20 3 ssv \s+ 2 2 2 +par_groupby --block 20 3 ssv \s+ 3 2 2 +par_groupby --block 20 3 ssv \s+ 3 3 2 +par_groupby --block 20 3 ssv \s+ NewRec +par_groupby --block 20 3 ssv \s+ 3 2 4 +par_groupby --block 20 3 ssv \s+ 3 2 2 +par_groupby --block 20 3 ssv \s+ NewRec +par_groupby --block 20 3 ssv \s+ 3 2 3 +par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 3 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 --block 20 +par_groupby --block 20 3 cssv [\s,]+ NewRec +par_groupby --block 20 3 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 3 cssv [\s,]+ NewRec +par_groupby --block 20 3 cssv [\s,]+ 2 ,2 ,2 , +par_groupby --block 20 3 cssv [\s,]+ 3 , 2 , 2 , +par_groupby --block 20 3 cssv [\s,]+ 3 , 3 , 2 , +par_groupby --block 20 3 cssv [\s,]+ NewRec +par_groupby --block 20 3 cssv [\s,]+ 3,,2,,4,, +par_groupby --block 20 3 cssv [\s,]+ NewRec +par_groupby --block 20 3 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby --block 20 3 cssv [\s,]+ 3 2 3 +par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 3 csv , ### test csv | --colsep , --groupby 3 --block 20 +par_groupby --block 20 3 csv , NewRec +par_groupby --block 20 3 csv , a1,b1,c1, +par_groupby --block 20 3 csv , NewRec +par_groupby --block 20 3 csv , 2,2,2, +par_groupby --block 20 3 csv , 3,2,2, +par_groupby --block 20 3 csv , 3,3,2, +par_groupby --block 20 3 csv , NewRec +par_groupby --block 20 3 csv , 3,2,4, +par_groupby --block 20 3 csv , NewRec +par_groupby --block 20 3 csv , 3,2,2, +par_groupby --block 20 3 csv , 3,2,3, +par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 s/^(.).*/$1/ tsv \t ### test tsv | --colsep \t --groupby s/^(.).*/$1/ --block 20 +par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec +par_groupby --block 20 s/^(.).*/$1/ tsv \t a1 b1 c1 +par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec +par_groupby --block 20 s/^(.).*/$1/ tsv \t 2 2 2 +par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec +par_groupby --block 20 s/^(.).*/$1/ tsv \t 3 2 2 +par_groupby --block 20 s/^(.).*/$1/ tsv \t 3 3 2 +par_groupby --block 20 s/^(.).*/$1/ tsv \t 3 2 4 +par_groupby --block 20 s/^(.).*/$1/ tsv \t 3 2 2 +par_groupby --block 20 s/^(.).*/$1/ tsv \t 3 2 3 +par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ ### test ssv | --colsep \s+ --groupby s/^(.).*/$1/ --block 20 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ a1 b1 c1 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 2 2 2 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 3 2 2 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 3 3 2 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 3 2 4 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 3 2 2 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 3 2 3 +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby s/^(.).*/$1/ --block 20 +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 2 ,2 ,2 , +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 3 , 2 , 2 , +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 3 , 3 , 2 , +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 3,,2,,4,, +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 3 2 3 +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 s/^(.).*/$1/ csv , ### test csv | --colsep , --groupby s/^(.).*/$1/ --block 20 +par_groupby --block 20 s/^(.).*/$1/ csv , NewRec +par_groupby --block 20 s/^(.).*/$1/ csv , a1,b1,c1, +par_groupby --block 20 s/^(.).*/$1/ csv , NewRec +par_groupby --block 20 s/^(.).*/$1/ csv , 2,2,2, +par_groupby --block 20 s/^(.).*/$1/ csv , NewRec +par_groupby --block 20 s/^(.).*/$1/ csv , 3,2,2, +par_groupby --block 20 s/^(.).*/$1/ csv , 3,3,2, +par_groupby --block 20 s/^(.).*/$1/ csv , 3,2,4, +par_groupby --block 20 s/^(.).*/$1/ csv , 3,2,2, +par_groupby --block 20 s/^(.).*/$1/ csv , 3,2,3, +par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 c1 tsv \t ### test tsv | --colsep \t --groupby c1 --block 20 +par_groupby --block 20 c1 tsv \t NewRec +par_groupby --block 20 c1 tsv \t a1 b1 c1 +par_groupby --block 20 c1 tsv \t 2 2 2 +par_groupby --block 20 c1 tsv \t 3 2 2 +par_groupby --block 20 c1 tsv \t 3 3 2 +par_groupby --block 20 c1 tsv \t NewRec +par_groupby --block 20 c1 tsv \t a1 b1 c1 +par_groupby --block 20 c1 tsv \t 3 2 4 +par_groupby --block 20 c1 tsv \t NewRec +par_groupby --block 20 c1 tsv \t a1 b1 c1 +par_groupby --block 20 c1 tsv \t 3 2 2 +par_groupby --block 20 c1 tsv \t NewRec +par_groupby --block 20 c1 tsv \t a1 b1 c1 +par_groupby --block 20 c1 tsv \t 3 2 3 +par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 --block 20 +par_groupby --block 20 c1 ssv \s+ NewRec +par_groupby --block 20 c1 ssv \s+ a1 b1 c1 +par_groupby --block 20 c1 ssv \s+ 2 2 2 +par_groupby --block 20 c1 ssv \s+ 3 2 2 +par_groupby --block 20 c1 ssv \s+ 3 3 2 +par_groupby --block 20 c1 ssv \s+ NewRec +par_groupby --block 20 c1 ssv \s+ a1 b1 c1 +par_groupby --block 20 c1 ssv \s+ 3 2 4 +par_groupby --block 20 c1 ssv \s+ NewRec +par_groupby --block 20 c1 ssv \s+ a1 b1 c1 +par_groupby --block 20 c1 ssv \s+ 3 2 2 +par_groupby --block 20 c1 ssv \s+ NewRec +par_groupby --block 20 c1 ssv \s+ a1 b1 c1 +par_groupby --block 20 c1 ssv \s+ 3 2 3 +par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 --block 20 +par_groupby --block 20 c1 cssv [\s,]+ NewRec +par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 c1 cssv [\s,]+ 2 ,2 ,2 , +par_groupby --block 20 c1 cssv [\s,]+ 3 , 2 , 2 , +par_groupby --block 20 c1 cssv [\s,]+ 3 , 3 , 2 , +par_groupby --block 20 c1 cssv [\s,]+ NewRec +par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 c1 cssv [\s,]+ 3,,2,,4,, +par_groupby --block 20 c1 cssv [\s,]+ NewRec +par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 c1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby --block 20 c1 cssv [\s,]+ 3 2 3 +par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 c1 csv , ### test csv | --colsep , --groupby c1 --block 20 +par_groupby --block 20 c1 csv , NewRec +par_groupby --block 20 c1 csv , a1,b1,c1, +par_groupby --block 20 c1 csv , 2,2,2, +par_groupby --block 20 c1 csv , 3,2,2, +par_groupby --block 20 c1 csv , 3,3,2, +par_groupby --block 20 c1 csv , NewRec +par_groupby --block 20 c1 csv , a1,b1,c1, +par_groupby --block 20 c1 csv , 3,2,4, +par_groupby --block 20 c1 csv , NewRec +par_groupby --block 20 c1 csv , a1,b1,c1, +par_groupby --block 20 c1 csv , 3,2,2, +par_groupby --block 20 c1 csv , NewRec +par_groupby --block 20 c1 csv , a1,b1,c1, +par_groupby --block 20 c1 csv , 3,2,3, +par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby c1 $_%=2 --block 20 +par_groupby --block 20 c1 $_%=2 tsv \t NewRec +par_groupby --block 20 c1 $_%=2 tsv \t a1 b1 c1 +par_groupby --block 20 c1 $_%=2 tsv \t 2 2 2 +par_groupby --block 20 c1 $_%=2 tsv \t 3 2 2 +par_groupby --block 20 c1 $_%=2 tsv \t 3 3 2 +par_groupby --block 20 c1 $_%=2 tsv \t 3 2 4 +par_groupby --block 20 c1 $_%=2 tsv \t 3 2 2 +par_groupby --block 20 c1 $_%=2 tsv \t 3 2 3 +par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 c1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 $_%=2 --block 20 +par_groupby --block 20 c1 $_%=2 ssv \s+ NewRec +par_groupby --block 20 c1 $_%=2 ssv \s+ a1 b1 c1 +par_groupby --block 20 c1 $_%=2 ssv \s+ 2 2 2 +par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 2 +par_groupby --block 20 c1 $_%=2 ssv \s+ 3 3 2 +par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 4 +par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 2 +par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 3 +par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2 --block 20 +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ NewRec +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ a1, b1, c1, +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 2 ,2 ,2 , +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 , 2 , 2 , +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 , 3 , 2 , +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3,,2,,4,, +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,, +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 2 3 +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87. +par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 87. Increasing to --blocksize 115. +par_groupby --block 20 c1 $_%=2 csv , ### test csv | --colsep , --groupby c1 $_%=2 --block 20 +par_groupby --block 20 c1 $_%=2 csv , NewRec +par_groupby --block 20 c1 $_%=2 csv , a1,b1,c1, +par_groupby --block 20 c1 $_%=2 csv , 2,2,2, +par_groupby --block 20 c1 $_%=2 csv , 3,2,2, +par_groupby --block 20 c1 $_%=2 csv , 3,3,2, +par_groupby --block 20 c1 $_%=2 csv , 3,2,4, +par_groupby --block 20 c1 $_%=2 csv , 3,2,2, +par_groupby --block 20 c1 $_%=2 csv , 3,2,3, +par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27. +par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37. +par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50. +par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. par_keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results par_keeporder_roundrobin OK par_kill_hup ### Are children killed if GNU Parallel receives HUP? There should be no sleep at the end