parallel: If --results {replstr} ends in /: save in dir. Otherwise save as file.

This commit is contained in:
Ole Tange 2017-01-27 23:15:25 +01:00
parent 968e2ab2bb
commit dae4f4b7ca
8 changed files with 544 additions and 481 deletions

View file

@ -208,44 +208,22 @@ file:///home/tange/privat/parallel/doc/release_new_version
from:tange@gnu.org from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org
Subject: GNU Parallel 20170122 ('George Michael') released <<[stable]>> Subject: GNU Parallel 20170222 ('<<>>') released <<[stable]>>
GNU Parallel 20170122 ('George Michael') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ GNU Parallel 20170222 ('<<>>') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
<<No new functionality was introduced so this is a good candidate for a stable release.>> <<No new functionality was introduced so this is a good candidate for a stable release.>>
Haiku of the month: Haiku of the month:
Speed is good for you <<>>
Multi speed is better still
Use GNU Parallel
-- Ole Tange -- Ole Tange
New in this release: New in this release:
* sql now uses a temporary credentials file for MySQL to avoid warning. http://workshop2016.iwslt.org/downloads/IWSLT_2016_paper_27.pdf
http://aip.scitation.org/doi/full/10.1063/1.4974021
* --sqlmaster and --sqlworker have been reworked.
* --sqlworker only reads from the DBURL: any command and any arguments are ignored.
* --sqlmaster +DBURL will append commands to the DBURL and not erase the table.
* If --results contain a replacement string, no tree structure with args will be generated.
* --fg --tmux or --fg --tmuxpane will connect to the tmux.
* GNU Parallel was cited in: Fast, Automated Indoor Light Detection, Classification, and Measurement https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-212.pdf
* GNU Parallel was cited in: Unbiased RNA Shotgun Metagenomics in Social and Solitary Wild Bees Detects Associations with Eukaryote Parasites and New Viruses http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0168456
* GNU Parallel was cited in: Almost Event-Rate Independent Monitoring of Metric Temporal Logic http://people.inf.ethz.ch/trayteld/papers/tacas17-aerial/aerial.pdf
* 使用GNU parallel命令并行预处理数据https://blog.razrlele.com/p/1843
* GNU Parallel as a queuing system: http://puntoblogspot.blogspot.com/2017/01/gnu-parallel-as-queuing-system.html
* AWS re:Invent 2016: Deep Dive on Amazon Elastic File System (STG202) slide 45 http://www.slideshare.net/AmazonWebServices/aws-reinvent-2016-deep-dive-on-amazon-elastic-file-system-stg202 and https://youtu.be/PlTuJx4VnGw?t=30m16s
* <<Possibly http://link.springer.com/chapter/10.1007%2F978-3-319-22053-6_46>> * <<Possibly http://link.springer.com/chapter/10.1007%2F978-3-319-22053-6_46>>

View file

@ -6544,9 +6544,24 @@ sub openoutputfiles {
my ($outfhw, $errfhw, $outname, $errname); my ($outfhw, $errfhw, $outname, $errname);
if($opt::results and not $Global::csv) { if($opt::results and not $Global::csv) {
my $dir = $self->{'commandline'}->resultsdir(); my $out = $self->{'commandline'}->results_out();
# prefix/name1/val1/name2/val2/seq my $seqname;
my $seqname = "$dir/seq"; if($out eq $opt::results or $out =~ m:/$:) {
# $opt::results = simple string or ending in /
# => $out is a dir/
# prefix/name1/val1/name2/val2/seq
$seqname = $out."seq";
# prefix/name1/val1/name2/val2/stdout
$outname = $out."stdout";
# prefix/name1/val1/name2/val2/stderr
$errname = $out."stderr";
} else {
# $opt::results = replacement string not ending in /
# => $out is a file
$outname = $out;
$errname = "$out.err";
$seqname = "$out.seq";
}
my $seqfhw; my $seqfhw;
if(not open($seqfhw, "+>", $seqname)) { if(not open($seqfhw, "+>", $seqname)) {
::error("Cannot write to `$seqname'."); ::error("Cannot write to `$seqname'.");
@ -6554,14 +6569,10 @@ sub openoutputfiles {
} }
print $seqfhw $self->seq(); print $seqfhw $self->seq();
close $seqfhw; close $seqfhw;
# prefix/name1/val1/name2/val2/stdout
$outname = "$dir/stdout";
if(not open($outfhw, "+>", $outname)) { if(not open($outfhw, "+>", $outname)) {
::error("Cannot write to `$outname'."); ::error("Cannot write to `$outname'.");
::wait_and_exit(255); ::wait_and_exit(255);
} }
# prefix/name1/val1/name2/val2/stderr
$errname = "$dir/stderr";
if(not open($errfhw, "+>", $errname)) { if(not open($errfhw, "+>", $errname)) {
::error("Cannot write to `$errname'."); ::error("Cannot write to `$errname'.");
::wait_and_exit(255); ::wait_and_exit(255);
@ -8037,9 +8048,9 @@ sub is_already_in_results {
# Returns: # Returns:
# $job_already_run = bool whether there is output for this or not # $job_already_run = bool whether there is output for this or not
my $job = $_[0]; my $job = $_[0];
my $dir = $job->{'commandline'}->resultsdir(); my $out = $job->{'commandline'}->results_out();
::debug("run", "Test $dir/stdout", -e "$dir/stdout", "\n"); ::debug("run", "Test ${out}stdout", -e "${out}stdout", "\n");
return -e "$dir/stdout"; return(-e $out."stdout" or -f $out);
} }
sub is_already_in_joblog { sub is_already_in_joblog {
@ -8905,7 +8916,7 @@ sub args_as_string {
map { @$_ } @{$self->{'arg_list'}}); map { @$_ } @{$self->{'arg_list'}});
} }
sub resultsdir { sub results_out {
sub max_file_name_length { sub max_file_name_length {
# Figure out the max length of a subdir # Figure out the max length of a subdir
# TODO and the max total length # TODO and the max total length
@ -8945,13 +8956,13 @@ sub resultsdir {
} }
my $self = shift; my $self = shift;
my $dir = $self->replace_placeholders([$opt::results],0,0); my $out = $self->replace_placeholders([$opt::results],0,0);
if($dir eq $opt::results) { if($out eq $opt::results) {
# $opt::results simple string: Append args_as_dirname # $opt::results simple string: Append args_as_dirname
my $args_as_dirname = $self->args_as_dirname(); my $args_as_dirname = $self->args_as_dirname();
# Output in: prefix/name1/val1/name2/val2/stdout # Output in: prefix/name1/val1/name2/val2/stdout
$dir = $opt::results."/".$args_as_dirname; $out = $opt::results."/".$args_as_dirname;
if(-d $dir or eval{ File::Path::mkpath($dir); }) { if(-d $out or eval{ File::Path::mkpath($out); }) {
# OK # OK
} else { } else {
# mkpath failed: Argument probably too long. # mkpath failed: Argument probably too long.
@ -8960,18 +8971,25 @@ sub resultsdir {
max_file_name_length($opt::results); max_file_name_length($opt::results);
$args_as_dirname = $self->args_as_dirname(); $args_as_dirname = $self->args_as_dirname();
# prefix/name1/val1/name2/val2/ # prefix/name1/val1/name2/val2/
$dir = $opt::results."/".$args_as_dirname; $out = $opt::results."/".$args_as_dirname;
File::Path::mkpath($dir); File::Path::mkpath($out);
} }
$out .="/";
} else { } else {
if(-d $dir or eval{ File::Path::mkpath($dir); }) { if($out =~ m:/$:) {
# OK # / = dir
if(-d $out or eval{ File::Path::mkpath($out); }) {
# OK
} else {
::error("Cannot make dir '$out'.");
::wait_and_exit(255);
}
} else { } else {
::error("Cannot make dir '$dir'."); $out =~ m:(.*)/:;
::wait_and_exit(255); File::Path::mkpath($1);
} }
} }
return $dir; return $out;
} }
sub args_as_dirname { sub args_as_dirname {

View file

@ -1448,54 +1448,21 @@ it to the command.
Only used with B<--pipe>. Only used with B<--pipe>.
=item B<--results> I<name> (beta testing) =item B<--results> I<name> (alpha testing)
=item B<--res> I<name> (beta testing) =item B<--res> I<name> (alpha testing)
Save the output into files. Save the output into files.
B<CSV file output> B<Simple string output dir>
If I<name> ends in B<.csv>/B<.tsv> the output will be a CSV-file If I<name> does not contain replacement strings and does not end in
named I<name>. B<.csv/.tsv>, the output will be stored in a directory tree rooted at
I<name>. Within this directory tree, each command will result in
B<.csv> gives a comma separated value file. B<.tsv> gives a TAB three files: I<name>/<ARGS>/stdout and I<name>/<ARGS>/stderr,
separated value file. I<name>/<ARGS>/seq, where <ARGS> is a sequence of directories
representing the header of the input source (if using B<--header :>)
B<-.csv>/B<-.tsv> are special: It will give the file on stdout or the number of the input source and corresponding values.
(standard output).
B<Dir structure output>
If I<name> does not end in B<.csv>/B<.tsv> will be treated as a dir.
If I<name> contains replacement strings output files will be stored in
the resulting dir.
E.g.
parallel --results my_{} echo ::: foo bar baz
will generate the files:
my_bar/seq
my_bar/stderr
my_bar/stdout
my_baz/seq
my_baz/stderr
my_baz/stdout
my_foo/seq
my_foo/stderr
my_foo/stdout
If I<name> does not contain replacement strings the files will be
stored in a directory tree rooted at I<name>. Within this directory
tree, each command will result in three files: I<name>/<ARGS>/stdout
and I<name>/<ARGS>/stderr, I<name>/<ARGS>/seq, where <ARGS> is a
sequence of directories representing the header of the input source
(if using B<--header :>) or the number of the input source and
corresponding values.
E.g: E.g:
@ -1536,26 +1503,64 @@ will generate the files:
foo/1/I/2/IIII/stderr foo/1/I/2/IIII/stderr
foo/1/I/2/IIII/stdout foo/1/I/2/IIII/stdout
and
parallel --results foo-{1} echo {1} {2} ::: I II ::: III IIII B<CSV file output>
If I<name> ends in B<.csv>/B<.tsv> the output will be a CSV-file
named I<name>.
B<.csv> gives a comma separated value file. B<.tsv> gives a TAB
separated value file.
B<-.csv>/B<-.tsv> are special: It will give the file on stdout
(standard output).
B<Replacement string output file>
If I<name> contains a replacement string and the replaced result does
not end in /, then the standard output will be stored in a file named
by this result. Standard error will be stored in the same file name
with '.err' added, and the sequence number will be stored in the same
file name with '.seq' added.
E.g.
parallel --results my_{} echo ::: foo bar baz
will generate the files: will generate the files:
foo-I/1/I/2/IIII/seq my_bar
foo-I/1/I/2/IIII/stderr my_bar.err
foo-I/1/I/2/IIII/stdout my_bar.seq
foo-I/1/I/2/III/seq my_baz
foo-I/1/I/2/III/stderr my_baz.err
foo-I/1/I/2/III/stdout my_baz.seq
foo-II/1/II/2/IIII/seq my_foo
foo-II/1/II/2/IIII/stderr my_foo.err
foo-II/1/II/2/IIII/stdout my_foo.seq
foo-II/1/II/2/III/seq
foo-II/1/II/2/III/stderr
foo-II/1/II/2/III/stdout
If you do not want the dir structure, try B<--files> B<--tag> instead.
B<Replacement string output dir>
If I<name> contains a replacement string and the replaced result ends
in /, then output files will be stored in the resulting dir.
E.g.
parallel --results my_{}/ echo ::: foo bar baz
will generate the files:
my_bar/seq
my_bar/stderr
my_bar/stdout
my_baz/seq
my_baz/stderr
my_baz/stdout
my_foo/seq
my_foo/stderr
my_foo/stdout
See also B<--files>, B<--tag>, B<--header>, B<--joblog>. See also B<--files>, B<--tag>, B<--header>, B<--joblog>.
@ -1994,11 +1999,11 @@ I<secs> seconds after starting each ssh. I<secs> can be less than 1
seconds. seconds.
=item B<-S> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> =item B<-S> I<[@hostgroups/][ncores/]sshlogin[,[@hostgroups/][ncores/]sshlogin[,...]]>
=item B<-S> I<@hostgroup> =item B<-S> I<@hostgroup>
=item B<--sshlogin> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> =item B<--sshlogin> I<[@hostgroups/][ncores/]sshlogin[,[@hostgroups/][ncores/]sshlogin[,...]]>
=item B<--sshlogin> I<@hostgroup> =item B<--sshlogin> I<@hostgroup>
@ -2014,8 +2019,9 @@ hostgroup will be used. Multiple I<@hostgroup> can be given.
GNU B<parallel> will determine the number of CPU cores on the remote GNU B<parallel> will determine the number of CPU cores on the remote
computers and run the number of jobs as specified by B<-j>. If the computers and run the number of jobs as specified by B<-j>. If the
number I<ncpu> is given GNU B<parallel> will use this number for number I<ncores> is given GNU B<parallel> will use this number for
number of CPU cores on the host. Normally I<ncpu> will not be needed. number of CPU cores on the host. Normally I<ncores> will not be
needed.
An I<sshlogin> is of the form: An I<sshlogin> is of the form:

View file

@ -765,6 +765,10 @@ simply executes according to Seq number.
=head2 Buffering on disk =head2 Buffering on disk
GNU B<parallel> buffers output, because if output is not buffered you
have to be ridiculously careful on sizes to avoid mixing of outputs
(see excellent example on https://catern.com/posts/pipes.html).
GNU B<parallel> buffers on disk in $TMPDIR using files, that are GNU B<parallel> buffers on disk in $TMPDIR using files, that are
removed as soon as they are created, but which are kept open. So even removed as soon as they are created, but which are kept open. So even
if GNU B<parallel> is killed by a power outage, there will be no files if GNU B<parallel> is killed by a power outage, there will be no files

View file

@ -518,42 +518,6 @@ echo '### Test bugfix if no command given'
echo '**' echo '**'
echo "### Test --results"
mkdir -p /tmp/parallel_results_test;
parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII;
ls /tmp/parallel_results_test/testA/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testA*
echo "### Test --res"
mkdir -p /tmp/parallel_results_test;
parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII;
ls /tmp/parallel_results_test/testD/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testD*
echo "### Test --result"
mkdir -p /tmp/parallel_results_test;
parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII;
ls /tmp/parallel_results_test/testE/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testE*
echo "### Test --results --header :"
mkdir -p /tmp/parallel_results_test;
parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII;
ls /tmp/parallel_results_test/testB/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testB*
echo "### Test --results --header : named - a/b swapped"
mkdir -p /tmp/parallel_results_test;
parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II;
ls /tmp/parallel_results_test/testC/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testC*
echo "### Test --results --header : piped"
mkdir -p /tmp/parallel_results_test;
(echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true;
find /tmp/parallel_results_test/testF/*/*/* | sort; rm -rf /tmp/parallel_results_test/testF*
echo "### Test --results --header : piped - non-existing column header"
mkdir -p /tmp/parallel_results_test;
(printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testG true; find /tmp/parallel_results_test/testG/ | sort; rm -rf /tmp/parallel_results_test/testG*
echo '**'
echo "bug #34958: --pipe with record size measured in lines" echo "bug #34958: --pipe with record size measured in lines"
seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2 seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2
@ -693,25 +657,6 @@ par_python_children() {
\""import os; f = os.popen('uname -p'); output = f.read(); rc = f.close()"\" \""import os; f = os.popen('uname -p'); output = f.read(); rc = f.close()"\"
} }
par_result_replace() {
echo '### bug #49983: --results with {1}'
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
}
par_pipepart_block_bigger_2G() { par_pipepart_block_bigger_2G() {
echo '### Test that --pipepart can have blocks > 2GB' echo '### Test that --pipepart can have blocks > 2GB'
tmp=$(mktemp) tmp=$(mktemp)

View file

@ -112,3 +112,90 @@ echo "### Test -m -I";
EOF EOF
par_failing_compressor() {
echo 'Compress with failing (de)compressor'
echo 'Test --tag/--line-buffer/--files in all combinations'
echo 'Test working/failing compressor/decompressor in all combinations'
echo '(-k is used as a dummy argument)'
stdout parallel -vk --header : --argsep ,,, \
parallel -k {tag} {lb} {files} --compress --compress-program {comp} --decompress-program {decomp} echo ::: C={comp},D={decomp} \
,,, tag --tag -k \
,,, lb --line-buffer -k \
,,, files --files -k \
,,, comp 'cat;true' 'cat;false' \
,,, decomp 'cat;true' 'cat;false' |
perl -pe 's:/par......par:/tmpfile:'
}
par_result() {
echo "### Test --results"
mkdir -p /tmp/parallel_results_test
parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testA/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testA*
echo "### Test --res"
mkdir -p /tmp/parallel_results_test
parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testD/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testD*
echo "### Test --result"
mkdir -p /tmp/parallel_results_test
parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testE/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testE*
echo "### Test --results --header :"
mkdir -p /tmp/parallel_results_test
parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII
ls /tmp/parallel_results_test/testB/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testB*
echo "### Test --results --header : named - a/b swapped"
mkdir -p /tmp/parallel_results_test
parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II
ls /tmp/parallel_results_test/testC/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testC*
echo "### Test --results --header : piped"
mkdir -p /tmp/parallel_results_test
(echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true
find /tmp/parallel_results_test/testF/*/*/* | sort
rm -rf /tmp/parallel_results_test/testF*
echo "### Test --results --header : piped - non-existing column header"
mkdir -p /tmp/parallel_results_test
(printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') |
parallel --header : --result /tmp/parallel_results_test/testG true
find /tmp/parallel_results_test/testG/ | sort
rm -rf /tmp/parallel_results_test/testG*
}
par_result_replace() {
echo '### bug #49983: --results with {1}'
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort
rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983-{}/ --header : -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983-* | sort
rm -rf /tmp/par_*_49983-*
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -1377,136 +1377,6 @@ echo '### Test bugfix if no command given'
parallel: Error: Command line too long (1000002 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz... parallel: Error: Command line too long (1000002 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
echo '**' echo '**'
** **
echo "### Test --results"
### Test --results
mkdir -p /tmp/parallel_results_test; parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testA/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testA*
I III
I IIII
II III
II IIII
/tmp/parallel_results_test/testA/1/I/2/III/seq
/tmp/parallel_results_test/testA/1/I/2/III/stderr
/tmp/parallel_results_test/testA/1/I/2/III/stdout
/tmp/parallel_results_test/testA/1/I/2/IIII/seq
/tmp/parallel_results_test/testA/1/I/2/IIII/stderr
/tmp/parallel_results_test/testA/1/I/2/IIII/stdout
/tmp/parallel_results_test/testA/1/II/2/III/seq
/tmp/parallel_results_test/testA/1/II/2/III/stderr
/tmp/parallel_results_test/testA/1/II/2/III/stdout
/tmp/parallel_results_test/testA/1/II/2/IIII/seq
/tmp/parallel_results_test/testA/1/II/2/IIII/stderr
/tmp/parallel_results_test/testA/1/II/2/IIII/stdout
echo "### Test --res"
### Test --res
mkdir -p /tmp/parallel_results_test; parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testD/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testD*
I III
I IIII
II III
II IIII
/tmp/parallel_results_test/testD/1/I/2/III/seq
/tmp/parallel_results_test/testD/1/I/2/III/stderr
/tmp/parallel_results_test/testD/1/I/2/III/stdout
/tmp/parallel_results_test/testD/1/I/2/IIII/seq
/tmp/parallel_results_test/testD/1/I/2/IIII/stderr
/tmp/parallel_results_test/testD/1/I/2/IIII/stdout
/tmp/parallel_results_test/testD/1/II/2/III/seq
/tmp/parallel_results_test/testD/1/II/2/III/stderr
/tmp/parallel_results_test/testD/1/II/2/III/stdout
/tmp/parallel_results_test/testD/1/II/2/IIII/seq
/tmp/parallel_results_test/testD/1/II/2/IIII/stderr
/tmp/parallel_results_test/testD/1/II/2/IIII/stdout
echo "### Test --result"
### Test --result
mkdir -p /tmp/parallel_results_test; parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testE/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testE*
I III
I IIII
II III
II IIII
/tmp/parallel_results_test/testE/1/I/2/III/seq
/tmp/parallel_results_test/testE/1/I/2/III/stderr
/tmp/parallel_results_test/testE/1/I/2/III/stdout
/tmp/parallel_results_test/testE/1/I/2/IIII/seq
/tmp/parallel_results_test/testE/1/I/2/IIII/stderr
/tmp/parallel_results_test/testE/1/I/2/IIII/stdout
/tmp/parallel_results_test/testE/1/II/2/III/seq
/tmp/parallel_results_test/testE/1/II/2/III/stderr
/tmp/parallel_results_test/testE/1/II/2/III/stdout
/tmp/parallel_results_test/testE/1/II/2/IIII/seq
/tmp/parallel_results_test/testE/1/II/2/IIII/stderr
/tmp/parallel_results_test/testE/1/II/2/IIII/stdout
echo "### Test --results --header :"
### Test --results --header :
mkdir -p /tmp/parallel_results_test; parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII; ls /tmp/parallel_results_test/testB/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testB*
I III
I IIII
II III
II IIII
/tmp/parallel_results_test/testB/a/I/b/III/seq
/tmp/parallel_results_test/testB/a/I/b/III/stderr
/tmp/parallel_results_test/testB/a/I/b/III/stdout
/tmp/parallel_results_test/testB/a/I/b/IIII/seq
/tmp/parallel_results_test/testB/a/I/b/IIII/stderr
/tmp/parallel_results_test/testB/a/I/b/IIII/stdout
/tmp/parallel_results_test/testB/a/II/b/III/seq
/tmp/parallel_results_test/testB/a/II/b/III/stderr
/tmp/parallel_results_test/testB/a/II/b/III/stdout
/tmp/parallel_results_test/testB/a/II/b/IIII/seq
/tmp/parallel_results_test/testB/a/II/b/IIII/stderr
/tmp/parallel_results_test/testB/a/II/b/IIII/stdout
echo "### Test --results --header : named - a/b swapped"
### Test --results --header : named - a/b swapped
mkdir -p /tmp/parallel_results_test; parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II; ls /tmp/parallel_results_test/testC/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testC*
I III
II III
I IIII
II IIII
/tmp/parallel_results_test/testC/a/I/b/III/seq
/tmp/parallel_results_test/testC/a/I/b/III/stderr
/tmp/parallel_results_test/testC/a/I/b/III/stdout
/tmp/parallel_results_test/testC/a/I/b/IIII/seq
/tmp/parallel_results_test/testC/a/I/b/IIII/stderr
/tmp/parallel_results_test/testC/a/I/b/IIII/stdout
/tmp/parallel_results_test/testC/a/II/b/III/seq
/tmp/parallel_results_test/testC/a/II/b/III/stderr
/tmp/parallel_results_test/testC/a/II/b/III/stdout
/tmp/parallel_results_test/testC/a/II/b/IIII/seq
/tmp/parallel_results_test/testC/a/II/b/IIII/stderr
/tmp/parallel_results_test/testC/a/II/b/IIII/stdout
echo "### Test --results --header : piped"
### Test --results --header : piped
mkdir -p /tmp/parallel_results_test; (echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true; find /tmp/parallel_results_test/testF/*/*/* | sort; rm -rf /tmp/parallel_results_test/testF*
/tmp/parallel_results_test/testF/Col/backslash\\tab/2
/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof
/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/seq
/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stderr
/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stdout
parallel: Warning: a NUL character occurred in the input.
parallel: Warning: It cannot be passed through in the argument list.
parallel: Warning: Did you mean to use the --null option?
echo "### Test --results --header : piped - non-existing column header"
### Test --results --header : piped - non-existing column header
mkdir -p /tmp/parallel_results_test; (printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testG true; find /tmp/parallel_results_test/testG/ | sort; rm -rf /tmp/parallel_results_test/testG*
/tmp/parallel_results_test/testG/
/tmp/parallel_results_test/testG/Col1
/tmp/parallel_results_test/testG/Col1/backslash\\tab
/tmp/parallel_results_test/testG/Col1/backslash\\tab/2
/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof
/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/seq
/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stderr
/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stdout
/tmp/parallel_results_test/testG/Col1/v1
/tmp/parallel_results_test/testG/Col1/v1/2
/tmp/parallel_results_test/testG/Col1/v1/2/v2
/tmp/parallel_results_test/testG/Col1/v1/2/v2/3
/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3
/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/seq
/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stderr
/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stdout
parallel: Warning: a NUL character occurred in the input.
parallel: Warning: It cannot be passed through in the argument list.
parallel: Warning: Did you mean to use the --null option?
echo '**'
**
echo "bug #34958: --pipe with record size measured in lines" echo "bug #34958: --pipe with record size measured in lines"
bug #34958: --pipe with record size measured in lines bug #34958: --pipe with record size measured in lines
seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2 seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2
@ -1754,188 +1624,3 @@ par_file_ending_in_newline '
par_pipepart_block_bigger_2G ### Test that --pipepart can have blocks > 2GB par_pipepart_block_bigger_2G ### Test that --pipepart can have blocks > 2GB
par_pipepart_block_bigger_2G 1 1 4 par_pipepart_block_bigger_2G 1 1 4
par_python_children ### bug #49970: Python child process dies if --env is used par_python_children ### bug #49970: Python child process dies if --env is used
par_result_replace ### bug #49983: --results with {1}
par_result_replace foo
par_result_replace bar
par_result_replace baz
par_result_replace /tmp/par_bar_49983
par_result_replace /tmp/par_bar_49983/seq
par_result_replace /tmp/par_bar_49983/stderr
par_result_replace /tmp/par_bar_49983/stdout
par_result_replace /tmp/par_baz_49983
par_result_replace /tmp/par_baz_49983/seq
par_result_replace /tmp/par_baz_49983/stderr
par_result_replace /tmp/par_baz_49983/stdout
par_result_replace /tmp/par_foo_49983
par_result_replace /tmp/par_foo_49983/seq
par_result_replace /tmp/par_foo_49983/stderr
par_result_replace /tmp/par_foo_49983/stdout
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par_bar A_49983
par_result_replace /tmp/par_bar A_49983/seq
par_result_replace /tmp/par_bar A_49983/stderr
par_result_replace /tmp/par_bar A_49983/stdout
par_result_replace /tmp/par_bar B_49983
par_result_replace /tmp/par_bar B_49983/seq
par_result_replace /tmp/par_bar B_49983/stderr
par_result_replace /tmp/par_bar B_49983/stdout
par_result_replace /tmp/par_bar C_49983
par_result_replace /tmp/par_bar C_49983/seq
par_result_replace /tmp/par_bar C_49983/stderr
par_result_replace /tmp/par_bar C_49983/stdout
par_result_replace /tmp/par_baz A_49983
par_result_replace /tmp/par_baz A_49983/seq
par_result_replace /tmp/par_baz A_49983/stderr
par_result_replace /tmp/par_baz A_49983/stdout
par_result_replace /tmp/par_baz B_49983
par_result_replace /tmp/par_baz B_49983/seq
par_result_replace /tmp/par_baz B_49983/stderr
par_result_replace /tmp/par_baz B_49983/stdout
par_result_replace /tmp/par_baz C_49983
par_result_replace /tmp/par_baz C_49983/seq
par_result_replace /tmp/par_baz C_49983/stderr
par_result_replace /tmp/par_baz C_49983/stdout
par_result_replace /tmp/par_foo A_49983
par_result_replace /tmp/par_foo A_49983/seq
par_result_replace /tmp/par_foo A_49983/stderr
par_result_replace /tmp/par_foo A_49983/stdout
par_result_replace /tmp/par_foo B_49983
par_result_replace /tmp/par_foo B_49983/seq
par_result_replace /tmp/par_foo B_49983/stderr
par_result_replace /tmp/par_foo B_49983/stdout
par_result_replace /tmp/par_foo C_49983
par_result_replace /tmp/par_foo C_49983/seq
par_result_replace /tmp/par_foo C_49983/stderr
par_result_replace /tmp/par_foo C_49983/stdout
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par_bar-A_49983
par_result_replace /tmp/par_bar-A_49983/seq
par_result_replace /tmp/par_bar-A_49983/stderr
par_result_replace /tmp/par_bar-A_49983/stdout
par_result_replace /tmp/par_bar-B_49983
par_result_replace /tmp/par_bar-B_49983/seq
par_result_replace /tmp/par_bar-B_49983/stderr
par_result_replace /tmp/par_bar-B_49983/stdout
par_result_replace /tmp/par_bar-C_49983
par_result_replace /tmp/par_bar-C_49983/seq
par_result_replace /tmp/par_bar-C_49983/stderr
par_result_replace /tmp/par_bar-C_49983/stdout
par_result_replace /tmp/par_baz-A_49983
par_result_replace /tmp/par_baz-A_49983/seq
par_result_replace /tmp/par_baz-A_49983/stderr
par_result_replace /tmp/par_baz-A_49983/stdout
par_result_replace /tmp/par_baz-B_49983
par_result_replace /tmp/par_baz-B_49983/seq
par_result_replace /tmp/par_baz-B_49983/stderr
par_result_replace /tmp/par_baz-B_49983/stdout
par_result_replace /tmp/par_baz-C_49983
par_result_replace /tmp/par_baz-C_49983/seq
par_result_replace /tmp/par_baz-C_49983/stderr
par_result_replace /tmp/par_baz-C_49983/stdout
par_result_replace /tmp/par_foo-A_49983
par_result_replace /tmp/par_foo-A_49983/seq
par_result_replace /tmp/par_foo-A_49983/stderr
par_result_replace /tmp/par_foo-A_49983/stdout
par_result_replace /tmp/par_foo-B_49983
par_result_replace /tmp/par_foo-B_49983/seq
par_result_replace /tmp/par_foo-B_49983/stderr
par_result_replace /tmp/par_foo-B_49983/stdout
par_result_replace /tmp/par_foo-C_49983
par_result_replace /tmp/par_foo-C_49983/seq
par_result_replace /tmp/par_foo-C_49983/stderr
par_result_replace /tmp/par_foo-C_49983/stdout
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par__49983
par_result_replace /tmp/par__49983/1
par_result_replace /tmp/par__49983/1/bar
par_result_replace /tmp/par__49983/1/bar/2
par_result_replace /tmp/par__49983/1/bar/2/A
par_result_replace /tmp/par__49983/1/bar/2/A/seq
par_result_replace /tmp/par__49983/1/bar/2/A/stderr
par_result_replace /tmp/par__49983/1/bar/2/A/stdout
par_result_replace /tmp/par__49983/1/bar/2/B
par_result_replace /tmp/par__49983/1/bar/2/B/seq
par_result_replace /tmp/par__49983/1/bar/2/B/stderr
par_result_replace /tmp/par__49983/1/bar/2/B/stdout
par_result_replace /tmp/par__49983/1/bar/2/C
par_result_replace /tmp/par__49983/1/bar/2/C/seq
par_result_replace /tmp/par__49983/1/bar/2/C/stderr
par_result_replace /tmp/par__49983/1/bar/2/C/stdout
par_result_replace /tmp/par__49983/1/baz
par_result_replace /tmp/par__49983/1/baz/2
par_result_replace /tmp/par__49983/1/baz/2/A
par_result_replace /tmp/par__49983/1/baz/2/A/seq
par_result_replace /tmp/par__49983/1/baz/2/A/stderr
par_result_replace /tmp/par__49983/1/baz/2/A/stdout
par_result_replace /tmp/par__49983/1/baz/2/B
par_result_replace /tmp/par__49983/1/baz/2/B/seq
par_result_replace /tmp/par__49983/1/baz/2/B/stderr
par_result_replace /tmp/par__49983/1/baz/2/B/stdout
par_result_replace /tmp/par__49983/1/baz/2/C
par_result_replace /tmp/par__49983/1/baz/2/C/seq
par_result_replace /tmp/par__49983/1/baz/2/C/stderr
par_result_replace /tmp/par__49983/1/baz/2/C/stdout
par_result_replace /tmp/par__49983/1/foo
par_result_replace /tmp/par__49983/1/foo/2
par_result_replace /tmp/par__49983/1/foo/2/A
par_result_replace /tmp/par__49983/1/foo/2/A/seq
par_result_replace /tmp/par__49983/1/foo/2/A/stderr
par_result_replace /tmp/par__49983/1/foo/2/A/stdout
par_result_replace /tmp/par__49983/1/foo/2/B
par_result_replace /tmp/par__49983/1/foo/2/B/seq
par_result_replace /tmp/par__49983/1/foo/2/B/stderr
par_result_replace /tmp/par__49983/1/foo/2/B/stdout
par_result_replace /tmp/par__49983/1/foo/2/C
par_result_replace /tmp/par__49983/1/foo/2/C/seq
par_result_replace /tmp/par__49983/1/foo/2/C/stderr
par_result_replace /tmp/par__49983/1/foo/2/C/stdout
par_result_replace bar B
par_result_replace bar C
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par__49983
par_result_replace /tmp/par__49983/A
par_result_replace /tmp/par__49983/A/B
par_result_replace /tmp/par__49983/A/B/foo
par_result_replace /tmp/par__49983/A/B/foo/bar
par_result_replace /tmp/par__49983/A/B/foo/bar/seq
par_result_replace /tmp/par__49983/A/B/foo/bar/stderr
par_result_replace /tmp/par__49983/A/B/foo/bar/stdout
par_result_replace /tmp/par__49983/A/B/foo/baz
par_result_replace /tmp/par__49983/A/B/foo/baz/seq
par_result_replace /tmp/par__49983/A/B/foo/baz/stderr
par_result_replace /tmp/par__49983/A/B/foo/baz/stdout
par_result_replace /tmp/par__49983/A/C
par_result_replace /tmp/par__49983/A/C/foo
par_result_replace /tmp/par__49983/A/C/foo/bar
par_result_replace /tmp/par__49983/A/C/foo/bar/seq
par_result_replace /tmp/par__49983/A/C/foo/bar/stderr
par_result_replace /tmp/par__49983/A/C/foo/bar/stdout
par_result_replace /tmp/par__49983/A/C/foo/baz
par_result_replace /tmp/par__49983/A/C/foo/baz/seq
par_result_replace /tmp/par__49983/A/C/foo/baz/stderr
par_result_replace /tmp/par__49983/A/C/foo/baz/stdout

View file

@ -369,3 +369,343 @@ a7 b1 2 3 4 5 6 7
a8 b1 2 3 4 5 6 7 8 a8 b1 2 3 4 5 6 7 8
a9 b1 2 3 4 5 6 7 8 9 a9 b1 2 3 4 5 6 7 8 9
a10 b1 2 3 4 5 6 7 8 9 10 a10 b1 2 3 4 5 6 7 8 9 10
par_failing_compressor Compress with failing (de)compressor
par_failing_compressor Test --tag/--line-buffer/--files in all combinations
par_failing_compressor Test working/failing compressor/decompressor in all combinations
par_failing_compressor (-k is used as a dummy argument)
par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true C=cat;true,D=cat;true
par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false C=cat;true,D=cat;false
par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true C=cat;false,D=cat;true
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false C=cat;false,D=cat;false
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true C=cat;true,D=cat;true
par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false C=cat;true,D=cat;false
par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true C=cat;false,D=cat;true
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false C=cat;false,D=cat;false
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true
par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false
par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true
par_failing_compressor C=cat;true,D=cat;true
par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false
par_failing_compressor C=cat;true,D=cat;false
par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true
par_failing_compressor C=cat;false,D=cat;true
par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false
par_failing_compressor parallel: Error: cat;false failed.
par_result ### Test --results
par_result I III
par_result I IIII
par_result II III
par_result II IIII
par_result /tmp/parallel_results_test/testA/1/I/2/III/seq
par_result /tmp/parallel_results_test/testA/1/I/2/III/stderr
par_result /tmp/parallel_results_test/testA/1/I/2/III/stdout
par_result /tmp/parallel_results_test/testA/1/I/2/IIII/seq
par_result /tmp/parallel_results_test/testA/1/I/2/IIII/stderr
par_result /tmp/parallel_results_test/testA/1/I/2/IIII/stdout
par_result /tmp/parallel_results_test/testA/1/II/2/III/seq
par_result /tmp/parallel_results_test/testA/1/II/2/III/stderr
par_result /tmp/parallel_results_test/testA/1/II/2/III/stdout
par_result /tmp/parallel_results_test/testA/1/II/2/IIII/seq
par_result /tmp/parallel_results_test/testA/1/II/2/IIII/stderr
par_result /tmp/parallel_results_test/testA/1/II/2/IIII/stdout
par_result ### Test --res
par_result I III
par_result I IIII
par_result II III
par_result II IIII
par_result /tmp/parallel_results_test/testD/1/I/2/III/seq
par_result /tmp/parallel_results_test/testD/1/I/2/III/stderr
par_result /tmp/parallel_results_test/testD/1/I/2/III/stdout
par_result /tmp/parallel_results_test/testD/1/I/2/IIII/seq
par_result /tmp/parallel_results_test/testD/1/I/2/IIII/stderr
par_result /tmp/parallel_results_test/testD/1/I/2/IIII/stdout
par_result /tmp/parallel_results_test/testD/1/II/2/III/seq
par_result /tmp/parallel_results_test/testD/1/II/2/III/stderr
par_result /tmp/parallel_results_test/testD/1/II/2/III/stdout
par_result /tmp/parallel_results_test/testD/1/II/2/IIII/seq
par_result /tmp/parallel_results_test/testD/1/II/2/IIII/stderr
par_result /tmp/parallel_results_test/testD/1/II/2/IIII/stdout
par_result ### Test --result
par_result I III
par_result I IIII
par_result II III
par_result II IIII
par_result /tmp/parallel_results_test/testE/1/I/2/III/seq
par_result /tmp/parallel_results_test/testE/1/I/2/III/stderr
par_result /tmp/parallel_results_test/testE/1/I/2/III/stdout
par_result /tmp/parallel_results_test/testE/1/I/2/IIII/seq
par_result /tmp/parallel_results_test/testE/1/I/2/IIII/stderr
par_result /tmp/parallel_results_test/testE/1/I/2/IIII/stdout
par_result /tmp/parallel_results_test/testE/1/II/2/III/seq
par_result /tmp/parallel_results_test/testE/1/II/2/III/stderr
par_result /tmp/parallel_results_test/testE/1/II/2/III/stdout
par_result /tmp/parallel_results_test/testE/1/II/2/IIII/seq
par_result /tmp/parallel_results_test/testE/1/II/2/IIII/stderr
par_result /tmp/parallel_results_test/testE/1/II/2/IIII/stdout
par_result ### Test --results --header :
par_result I III
par_result I IIII
par_result II III
par_result II IIII
par_result /tmp/parallel_results_test/testB/a/I/b/III/seq
par_result /tmp/parallel_results_test/testB/a/I/b/III/stderr
par_result /tmp/parallel_results_test/testB/a/I/b/III/stdout
par_result /tmp/parallel_results_test/testB/a/I/b/IIII/seq
par_result /tmp/parallel_results_test/testB/a/I/b/IIII/stderr
par_result /tmp/parallel_results_test/testB/a/I/b/IIII/stdout
par_result /tmp/parallel_results_test/testB/a/II/b/III/seq
par_result /tmp/parallel_results_test/testB/a/II/b/III/stderr
par_result /tmp/parallel_results_test/testB/a/II/b/III/stdout
par_result /tmp/parallel_results_test/testB/a/II/b/IIII/seq
par_result /tmp/parallel_results_test/testB/a/II/b/IIII/stderr
par_result /tmp/parallel_results_test/testB/a/II/b/IIII/stdout
par_result ### Test --results --header : named - a/b swapped
par_result I III
par_result II III
par_result I IIII
par_result II IIII
par_result /tmp/parallel_results_test/testC/a/I/b/III/seq
par_result /tmp/parallel_results_test/testC/a/I/b/III/stderr
par_result /tmp/parallel_results_test/testC/a/I/b/III/stdout
par_result /tmp/parallel_results_test/testC/a/I/b/IIII/seq
par_result /tmp/parallel_results_test/testC/a/I/b/IIII/stderr
par_result /tmp/parallel_results_test/testC/a/I/b/IIII/stdout
par_result /tmp/parallel_results_test/testC/a/II/b/III/seq
par_result /tmp/parallel_results_test/testC/a/II/b/III/stderr
par_result /tmp/parallel_results_test/testC/a/II/b/III/stdout
par_result /tmp/parallel_results_test/testC/a/II/b/IIII/seq
par_result /tmp/parallel_results_test/testC/a/II/b/IIII/stderr
par_result /tmp/parallel_results_test/testC/a/II/b/IIII/stdout
par_result ### Test --results --header : piped
par_result parallel: Warning: a NUL character occurred in the input.
par_result parallel: Warning: It cannot be passed through in the argument list.
par_result parallel: Warning: Did you mean to use the --null option?
par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2
par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof
par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/seq
par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stderr
par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stdout
par_result ### Test --results --header : piped - non-existing column header
par_result parallel: Warning: a NUL character occurred in the input.
par_result parallel: Warning: It cannot be passed through in the argument list.
par_result parallel: Warning: Did you mean to use the --null option?
par_result /tmp/parallel_results_test/testG/
par_result /tmp/parallel_results_test/testG/Col1
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/seq
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stderr
par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stdout
par_result /tmp/parallel_results_test/testG/Col1/v1
par_result /tmp/parallel_results_test/testG/Col1/v1/2
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/seq
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stderr
par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stdout
par_result_replace ### bug #49983: --results with {1}
par_result_replace foo
par_result_replace bar
par_result_replace baz
par_result_replace /tmp/par_bar_49983
par_result_replace /tmp/par_baz_49983
par_result_replace /tmp/par_foo_49983
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par_bar A_49983
par_result_replace /tmp/par_bar B_49983
par_result_replace /tmp/par_bar C_49983
par_result_replace /tmp/par_baz A_49983
par_result_replace /tmp/par_baz B_49983
par_result_replace /tmp/par_baz C_49983
par_result_replace /tmp/par_foo A_49983
par_result_replace /tmp/par_foo B_49983
par_result_replace /tmp/par_foo C_49983
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par_bar-A_49983
par_result_replace /tmp/par_bar-B_49983
par_result_replace /tmp/par_bar-C_49983
par_result_replace /tmp/par_baz-A_49983
par_result_replace /tmp/par_baz-B_49983
par_result_replace /tmp/par_baz-C_49983
par_result_replace /tmp/par_foo-A_49983
par_result_replace /tmp/par_foo-B_49983
par_result_replace /tmp/par_foo-C_49983
par_result_replace foo A
par_result_replace foo B
par_result_replace foo C
par_result_replace bar A
par_result_replace bar B
par_result_replace bar C
par_result_replace baz A
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par__49983
par_result_replace /tmp/par__49983/1
par_result_replace /tmp/par__49983/1/bar
par_result_replace /tmp/par__49983/1/bar/2
par_result_replace /tmp/par__49983/1/bar/2/A
par_result_replace /tmp/par__49983/1/bar/2/A/seq
par_result_replace /tmp/par__49983/1/bar/2/A/stderr
par_result_replace /tmp/par__49983/1/bar/2/A/stdout
par_result_replace /tmp/par__49983/1/bar/2/B
par_result_replace /tmp/par__49983/1/bar/2/B/seq
par_result_replace /tmp/par__49983/1/bar/2/B/stderr
par_result_replace /tmp/par__49983/1/bar/2/B/stdout
par_result_replace /tmp/par__49983/1/bar/2/C
par_result_replace /tmp/par__49983/1/bar/2/C/seq
par_result_replace /tmp/par__49983/1/bar/2/C/stderr
par_result_replace /tmp/par__49983/1/bar/2/C/stdout
par_result_replace /tmp/par__49983/1/baz
par_result_replace /tmp/par__49983/1/baz/2
par_result_replace /tmp/par__49983/1/baz/2/A
par_result_replace /tmp/par__49983/1/baz/2/A/seq
par_result_replace /tmp/par__49983/1/baz/2/A/stderr
par_result_replace /tmp/par__49983/1/baz/2/A/stdout
par_result_replace /tmp/par__49983/1/baz/2/B
par_result_replace /tmp/par__49983/1/baz/2/B/seq
par_result_replace /tmp/par__49983/1/baz/2/B/stderr
par_result_replace /tmp/par__49983/1/baz/2/B/stdout
par_result_replace /tmp/par__49983/1/baz/2/C
par_result_replace /tmp/par__49983/1/baz/2/C/seq
par_result_replace /tmp/par__49983/1/baz/2/C/stderr
par_result_replace /tmp/par__49983/1/baz/2/C/stdout
par_result_replace /tmp/par__49983/1/foo
par_result_replace /tmp/par__49983/1/foo/2
par_result_replace /tmp/par__49983/1/foo/2/A
par_result_replace /tmp/par__49983/1/foo/2/A/seq
par_result_replace /tmp/par__49983/1/foo/2/A/stderr
par_result_replace /tmp/par__49983/1/foo/2/A/stdout
par_result_replace /tmp/par__49983/1/foo/2/B
par_result_replace /tmp/par__49983/1/foo/2/B/seq
par_result_replace /tmp/par__49983/1/foo/2/B/stderr
par_result_replace /tmp/par__49983/1/foo/2/B/stdout
par_result_replace /tmp/par__49983/1/foo/2/C
par_result_replace /tmp/par__49983/1/foo/2/C/seq
par_result_replace /tmp/par__49983/1/foo/2/C/stderr
par_result_replace /tmp/par__49983/1/foo/2/C/stdout
par_result_replace bar B
par_result_replace bar C
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par__49983
par_result_replace /tmp/par__49983/A
par_result_replace /tmp/par__49983/A/B
par_result_replace /tmp/par__49983/A/B/foo
par_result_replace /tmp/par__49983/A/B/foo/bar
par_result_replace /tmp/par__49983/A/B/foo/bar/seq
par_result_replace /tmp/par__49983/A/B/foo/bar/stderr
par_result_replace /tmp/par__49983/A/B/foo/bar/stdout
par_result_replace /tmp/par__49983/A/B/foo/baz
par_result_replace /tmp/par__49983/A/B/foo/baz/seq
par_result_replace /tmp/par__49983/A/B/foo/baz/stderr
par_result_replace /tmp/par__49983/A/B/foo/baz/stdout
par_result_replace /tmp/par__49983/A/C
par_result_replace /tmp/par__49983/A/C/foo
par_result_replace /tmp/par__49983/A/C/foo/bar
par_result_replace /tmp/par__49983/A/C/foo/bar/seq
par_result_replace /tmp/par__49983/A/C/foo/bar/stderr
par_result_replace /tmp/par__49983/A/C/foo/bar/stdout
par_result_replace /tmp/par__49983/A/C/foo/baz
par_result_replace /tmp/par__49983/A/C/foo/baz/seq
par_result_replace /tmp/par__49983/A/C/foo/baz/stderr
par_result_replace /tmp/par__49983/A/C/foo/baz/stdout
par_result_replace bar B
par_result_replace bar C
par_result_replace baz B
par_result_replace baz C
par_result_replace /tmp/par__49983-bar B
par_result_replace /tmp/par__49983-bar B/seq
par_result_replace /tmp/par__49983-bar B/stderr
par_result_replace /tmp/par__49983-bar B/stdout
par_result_replace /tmp/par__49983-bar C
par_result_replace /tmp/par__49983-bar C/seq
par_result_replace /tmp/par__49983-bar C/stderr
par_result_replace /tmp/par__49983-bar C/stdout
par_result_replace /tmp/par__49983-baz B
par_result_replace /tmp/par__49983-baz B/seq
par_result_replace /tmp/par__49983-baz B/stderr
par_result_replace /tmp/par__49983-baz B/stdout
par_result_replace /tmp/par__49983-baz C
par_result_replace /tmp/par__49983-baz C/seq
par_result_replace /tmp/par__49983-baz C/stderr
par_result_replace /tmp/par__49983-baz C/stdout