parallel: Fixed: --null conflicts with --resume --joblog.

This commit is contained in:
Ole Tange 2019-03-17 23:07:32 +01:00
parent 8ee7777ee9
commit fe4173927f
24 changed files with 396 additions and 177 deletions

20
configure vendored
View file

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for parallel 20190222. # Generated by GNU Autoconf 2.69 for parallel 20190310.
# #
# Report bugs to <bug-parallel@gnu.org>. # Report bugs to <bug-parallel@gnu.org>.
# #
@ -579,8 +579,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='parallel' PACKAGE_NAME='parallel'
PACKAGE_TARNAME='parallel' PACKAGE_TARNAME='parallel'
PACKAGE_VERSION='20190222' PACKAGE_VERSION='20190310'
PACKAGE_STRING='parallel 20190222' PACKAGE_STRING='parallel 20190310'
PACKAGE_BUGREPORT='bug-parallel@gnu.org' PACKAGE_BUGREPORT='bug-parallel@gnu.org'
PACKAGE_URL='' PACKAGE_URL=''
@ -1214,7 +1214,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures parallel 20190222 to adapt to many kinds of systems. \`configure' configures parallel 20190310 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1281,7 +1281,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of parallel 20190222:";; short | recursive ) echo "Configuration of parallel 20190310:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1357,7 +1357,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
parallel configure 20190222 parallel configure 20190310
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -1374,7 +1374,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by parallel $as_me 20190222, which was It was created by parallel $as_me 20190310, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2237,7 +2237,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='parallel' PACKAGE='parallel'
VERSION='20190222' VERSION='20190310'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -2880,7 +2880,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by parallel $as_me 20190222, which was This file was extended by parallel $as_me 20190310, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -2942,7 +2942,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
parallel config.status 20190222 parallel config.status 20190310
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View file

@ -1,4 +1,4 @@
AC_INIT([parallel], [20190222], [bug-parallel@gnu.org]) AC_INIT([parallel], [20190310], [bug-parallel@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([ AC_CONFIG_FILES([

View file

@ -1,9 +1,10 @@
Quote of the month: Quote of the month:
There are so many things to love about GNU parallel. You could honestly teach a whole parallel computing course with it and never have to leave it for a real language.
-- Aubrey Bailey @DNAvinci@twitter
Parallel is a life send, what an awesome piece of software.
-- Blaze9@reddit.com
Y'all need some GNU parallel in your lives Y'all need some GNU parallel in your lives
-- ChaKu @ChaiLovesChai@twitter -- ChaKu @ChaiLovesChai@twitter

View file

@ -207,9 +207,10 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm> stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20190222 ('indien pakistan Kashmir') released <<[stable]>> Subject: GNU Parallel 20190322 (climatestrike FridayforFuture
Christchurch 'Max 8' fly i etiopien 737Max 8 indien pakistan Kashmir') released <<[stable]>>
GNU Parallel 20190222 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ GNU Parallel 20190322 ('') <<[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.>>
@ -220,7 +221,7 @@ Quote of the month:
New in this release: New in this release:
* GNU Parallel now includes a cheat sheet: * GNU Parallel now includes a cheat sheet: parallel_cheat.pdf
https://calendar.colorado.edu/event/high_throughput_computing_on_rmacc_summit_and_beyond#.XH2NBhB7mV4 https://calendar.colorado.edu/event/high_throughput_computing_on_rmacc_summit_and_beyond#.XH2NBhB7mV4

View file

@ -288,4 +288,4 @@ EXTRA_DIST = parallel sem sql niceload parcat parset env_parallel \
env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \ env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \
sem.pod parallel.pod env_parallel.pod niceload.pod \ sem.pod parallel.pod env_parallel.pod niceload.pod \
parallel_tutorial.pod parallel_book.pod parallel_design.pod \ parallel_tutorial.pod parallel_book.pod parallel_design.pod \
parallel_alternatives.pod $(DISTCLEANFILES) parallel_alternatives.pod parallel_cheat.fodt $(DISTCLEANFILES)

View file

@ -275,7 +275,7 @@ EXTRA_DIST = parallel sem sql niceload parcat parset env_parallel \
env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \ env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \
sem.pod parallel.pod env_parallel.pod niceload.pod \ sem.pod parallel.pod env_parallel.pod niceload.pod \
parallel_tutorial.pod parallel_book.pod parallel_design.pod \ parallel_tutorial.pod parallel_book.pod parallel_design.pod \
parallel_alternatives.pod $(DISTCLEANFILES) parallel_alternatives.pod parallel_cheat.fodt $(DISTCLEANFILES)
all: all-am all: all-am

View file

@ -186,6 +186,7 @@ env_parallel() {
# myfunc is a shell function (in zsh) # myfunc is a shell function (in zsh)
# which is /usr/bin/which (in sh, bash) # which is /usr/bin/which (in sh, bash)
# which is hashed (/usr/bin/which) # which is hashed (/usr/bin/which)
# gi is aliased to `grep -i' (in bash)
# aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' # aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
# Return 0 if found, 1 otherwise # Return 0 if found, 1 otherwise
LANG=C type "$@" | LANG=C type "$@" |

View file

@ -173,11 +173,12 @@ env_parallel() {
# type returns: # type returns:
# ll is an alias for ls -l (in ash) # ll is an alias for ls -l (in ash)
# bash is a tracked alias for /bin/bash # bash is a tracked alias for /bin/bash
# true is a shell builtin # true is a shell builtin (in bash)
# myfunc is a function (in bash) # myfunc is a function (in bash)
# myfunc is a shell function (in zsh) # myfunc is a shell function (in zsh)
# which is /usr/bin/which # which is /usr/bin/which (in sh, bash)
# which is hashed (/usr/bin/which) # which is hashed (/usr/bin/which)
# gi is aliased to `grep -i' (in bash)
# aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' # aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
# Return 0 if found, 1 otherwise # Return 0 if found, 1 otherwise
LANG=C type "$@" | LANG=C type "$@" |

View file

@ -186,6 +186,7 @@ env_parallel() {
# myfunc is a shell function (in zsh) # myfunc is a shell function (in zsh)
# which is /usr/bin/which (in sh, bash) # which is /usr/bin/which (in sh, bash)
# which is hashed (/usr/bin/which) # which is hashed (/usr/bin/which)
# gi is aliased to `grep -i' (in bash)
# aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' # aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
# Return 0 if found, 1 otherwise # Return 0 if found, 1 otherwise
LANG=C type "$@" | LANG=C type "$@" |

View file

@ -2009,6 +2009,8 @@ sub open_joblog() {
if($opt::resume || $opt::resume_failed || $opt::retry_failed) { if($opt::resume || $opt::resume_failed || $opt::retry_failed) {
if(open(my $joblog_fh, "<", $opt::joblog)) { if(open(my $joblog_fh, "<", $opt::joblog)) {
# Read the joblog # Read the joblog
# Override $/ with \n because -d might be set
local $/ = "\n";
# If there is a header: Open as append later # If there is a header: Open as append later
$append = <$joblog_fh>; $append = <$joblog_fh>;
my $joblog_regexp; my $joblog_regexp;
@ -2017,22 +2019,19 @@ sub open_joblog() {
# 4 host 1360490623.067 3.445 1023 1222 0 0 command # 4 host 1360490623.067 3.445 1023 1222 0 0 command
$joblog_regexp='^(\d+)(?:\t[^\t]+){5}\t0\t0\t'; $joblog_regexp='^(\d+)(?:\t[^\t]+){5}\t0\t0\t';
my @group; my @group;
{ while(<$joblog_fh>) {
local $/ = "\n"; if(/$joblog_regexp/o) {
while(<$joblog_fh>) { # This is 30% faster than set_job_already_run($1);
if(/$joblog_regexp/o) { vec($Global::job_already_run,($1||0),1) = 1;
# This is 30% faster than set_job_already_run($1); $Global::total_completed++;
vec($Global::job_already_run,($1||0),1) = 1; $group[$1-1] = "true";
$Global::total_completed++; } elsif(/(\d+)\s+\S+(\s+[-0-9.]+){6}\s+(.*)$/) {
$group[$1-1] = "true"; # Grab out the command
} elsif(/(\d+)\s+\S+(\s+[-0-9.]+){6}\s+(.*)$/) { $group[$1-1] = $3;
# Grab out the command } else {
$group[$1-1] = $3; chomp;
} else { ::error("Format of '$opt::joblog' is wrong: $_");
chomp; ::wait_and_exit(255);
::error("Format of '$opt::joblog' is wrong: $_");
::wait_and_exit(255);
}
} }
} }
if(@group) { if(@group) {
@ -2077,6 +2076,8 @@ sub open_joblog() {
} }
close $joblog_fh; close $joblog_fh;
} }
# $opt::null may be set if the commands contain \n
if($opt::null) { $/ = "\0"; }
} }
if($opt::dryrun) { if($opt::dryrun) {
# Do not write to joblog in a dry-run # Do not write to joblog in a dry-run
@ -2426,9 +2427,7 @@ sub shell_quote(@) {
# @strings = strings to be quoted # @strings = strings to be quoted
# Returns: # Returns:
# @shell_quoted_strings = string quoted as needed by the shell # @shell_quoted_strings = string quoted as needed by the shell
return wantarray ? return wantarray ? (map { Q($_) } @_) : (join" ",map { Q($_) } @_);
(map { Q($_) } @_)
: (join" ",map { Q($_) } @_);
} }
sub shell_quote_scalar_rc($) { sub shell_quote_scalar_rc($) {
@ -4190,7 +4189,7 @@ sub start_no_new_jobs() {
::status ::status
("$Global::progname: SIGTERM received. No new jobs will be started.", ("$Global::progname: SIGTERM received. No new jobs will be started.",
"$Global::progname: Waiting for these ".(keys %Global::running). "$Global::progname: Waiting for these ".(keys %Global::running).
" jobs to finish. Send SIGTERM again to stop now."); " jobs to finish. Send SIGTERM to stop now.");
list_running_jobs(); list_running_jobs();
$Global::start_no_new_jobs ||= 1; $Global::start_no_new_jobs ||= 1;
} }
@ -4569,11 +4568,14 @@ sub citation() {
"", "",
# Before changing this line, please read # Before changing this line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
"This helps funding further development; AND IT WON'T COST YOU A CENT.", "This helps funding further development; AND IT WON'T COST YOU A CENT.",
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.", "If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
"", "",
"More about funding GNU Parallel and the citation notice:", "More about funding GNU Parallel and the citation notice:",
"https://lists.gnu.org/archive/html/parallel/2013-11/msg00006.html",
"https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice", "https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice",
"https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt",
"", "",
"If you send a copy of your published article to tange\@gnu.org, it will be", "If you send a copy of your published article to tange\@gnu.org, it will be",
"mentioned in the release notes of next version of GNU Parallel.", "mentioned in the release notes of next version of GNU Parallel.",
@ -4591,8 +4593,13 @@ sub citation() {
close $fh; close $fh;
::status( ::status(
"", "",
"Thank you for your support. It is much appreciated. The citation", "Thank you for your support: You are the reason why there is funding to",
"notice is now silenced.", "continue maintaining GNU Parallel. On behalf of future versions of",
"GNU Parallel, which would not exist without your support:",
"",
" THANK YOU SO MUCH",
"",
"It is really appreciated. The citation notice is now silenced.",
""); "");
} else { } else {
::status( ::status(
@ -11166,8 +11173,8 @@ sub new($$) {
my $fhs = shift; my $fhs = shift;
for my $fh (@$fhs) { for my $fh (@$fhs) {
if(-t $fh and -t ($Global::status_fd || *STDERR)) { if(-t $fh and -t ($Global::status_fd || *STDERR)) {
::warning("Input is read from the terminal. You either know what you", ::warning("Input is read from the terminal. You are either an expert",
"are doing (in which case: YOU ARE AWESOME!) or you forgot", "(in which case: YOU ARE AWESOME!) or maybe you forgot",
"::: or :::: or -a or to pipe data into parallel. If so", "::: or :::: or -a or to pipe data into parallel. If so",
"consider going through the tutorial: man parallel_tutorial", "consider going through the tutorial: man parallel_tutorial",
"Press CTRL-D to exit."); "Press CTRL-D to exit.");

View file

@ -30,22 +30,23 @@ STOP!
Read the B<Reader's guide> below if you are new to GNU B<parallel>. Read the B<Reader's guide> below if you are new to GNU B<parallel>.
GNU B<parallel> is a shell tool for executing jobs in parallel using GNU B<parallel> is a shell tool for executing jobs in parallel using
one or more computers. A job can be a single command or a small one or more computers. A job can be a single command or a small script
script that has to be run for each of the lines in the input. The that has to be run for each of the lines in the input. The typical
typical input is a list of files, a list of hosts, a list of users, a input is a list of files, a list of hosts, a list of users, a list of
list of URLs, or a list of tables. A job can also be a command that URLs, or a list of tables. A job can also be a command that reads from
reads from a pipe. GNU B<parallel> can then split the input into a pipe. GNU B<parallel> can then split the input into blocks and pipe
blocks and pipe a block into each command in parallel. a block into each command in parallel.
If you use xargs and tee today you will find GNU B<parallel> very easy to If you use xargs and tee today you will find GNU B<parallel> very easy
use as GNU B<parallel> is written to have the same options as xargs. If to use as GNU B<parallel> is written to have the same options as
you write loops in shell, you will find GNU B<parallel> may be able to xargs. If you write loops in shell, you will find GNU B<parallel> may
replace most of the loops and make them run faster by running several be able to replace most of the loops and make them run faster by
jobs in parallel. running several jobs in parallel.
GNU B<parallel> makes sure output from the commands is the same output as GNU B<parallel> makes sure output from the commands is the same output
you would get had you run the commands sequentially. This makes it as you would get had you run the commands sequentially. This makes it
possible to use output from GNU B<parallel> as input for other programs. possible to use output from GNU B<parallel> as input for other
programs.
For each line of input GNU B<parallel> will execute I<command> with For each line of input GNU B<parallel> will execute I<command> with
the line as arguments. If no I<command> is given, the line of input is the line as arguments. If no I<command> is given, the line of input is
@ -121,8 +122,8 @@ replacement string; then the string is not quoted.
Input line without extension. This replacement string will be replaced Input line without extension. This replacement string will be replaced
by the input with the extension removed. If the input line contains by the input with the extension removed. If the input line contains
B<.> after the last B</>, the last B<.> until the end of the string will B<.> after the last B</>, the last B<.> until the end of the string
be removed and B<{.}> will be replaced with the will be removed and B<{.}> will be replaced with the
remaining. E.g. I<foo.jpg> becomes I<foo>, I<subdir/foo.jpg> becomes remaining. E.g. I<foo.jpg> becomes I<foo>, I<subdir/foo.jpg> becomes
I<subdir/foo>, I<sub.dir/foo.jpg> becomes I<sub.dir/foo>, I<subdir/foo>, I<sub.dir/foo.jpg> becomes I<sub.dir/foo>,
I<sub.dir/bar> remains I<sub.dir/bar>. If the input line does not I<sub.dir/bar> remains I<sub.dir/bar>. If the input line does not
@ -522,7 +523,7 @@ this will run 10*5 = 50 jobs in total:
parallel --pipepart -a myfile --block -10 -j5 wc parallel --pipepart -a myfile --block -10 -j5 wc
This is an efficient alternative to B<--round-robin> because data is This is an efficient alternative to B<--roundrobin> because data is
never read by GNU B<parallel>, but you can still have very few never read by GNU B<parallel>, but you can still have very few
jobslots process a large amount of data. jobslots process a large amount of data.
@ -1892,14 +1893,14 @@ with B<--sshlogin>.
=item B<--round> =item B<--round>
Normally B<--pipe> will give a single block to each instance of the Normally B<--pipe> will give a single block to each instance of the
command. With B<--round-robin> all blocks will at random be written to command. With B<--roundrobin> all blocks will at random be written to
commands already running. This is useful if the command takes a long commands already running. This is useful if the command takes a long
time to initialize. time to initialize.
B<--keep-order> will not work with B<--round-robin> as it is B<--keep-order> will not work with B<--roundrobin> as it is
impossible to track which input block corresponds to which output. impossible to track which input block corresponds to which output.
B<--round-robin> implies B<--pipe>, except if B<--pipepart> is given. B<--roundrobin> implies B<--pipe>, except if B<--pipepart> is given.
=item B<--rpl> 'I<tag> I<perl expression>' =item B<--rpl> 'I<tag> I<perl expression>'
@ -2741,6 +2742,17 @@ FUBAR in all files in this dir and subdirs:
Note B<-q> is needed because of the space in 'FOO BAR'. Note B<-q> is needed because of the space in 'FOO BAR'.
=head1 EXAMPLE: Simple network scanner
B<prips> can generate IP-addresses from CIDR notation. With GNU
B<parallel> you can build a simple network scanner to see which
addresses respond to B<ping>:
prips 130.229.16.0/20 | \
parallel --timeout 2 -j0 \
'ping -c 1 {} >/dev/null && echo {}' 2>/dev/null
=head1 EXAMPLE: Reading arguments from command line =head1 EXAMPLE: Reading arguments from command line
GNU B<parallel> can take the arguments from command line instead of GNU B<parallel> can take the arguments from command line instead of
@ -3069,11 +3081,11 @@ B<youtube-dl> is an excellent tool to download videos. It can,
however, not download videos in parallel. This takes a playlist and however, not download videos in parallel. This takes a playlist and
downloads 10 videos in parallel. downloads 10 videos in parallel.
url='https://youtu.be/watch?v=0wOf2Fgi3DE&list=UU_cznB5YZZmvAmeq7Y3EriQ' url='youtu.be/watch?v=0wOf2Fgi3DE&list=UU_cznB5YZZmvAmeq7Y3EriQ'
export url export url
youtube-dl --flat-playlist "$url" | youtube-dl --flat-playlist "https://$url" |
parallel --tagstring {#} --lb -j10 \ parallel --tagstring {#} --lb -j10 \
youtube-dl --playlist-start {#} --playlist-end {#} '"$url"' youtube-dl --playlist-start {#} --playlist-end {#} '"https://$url"'
=head1 EXAMPLE: Prepend last modified date (ISO8601) to file name =head1 EXAMPLE: Prepend last modified date (ISO8601) to file name
@ -3312,7 +3324,7 @@ repeat the list and use replacement string B<{choose_k}>:
parallel --plus echo {choose_k} ::: A B C D ::: A B C D parallel --plus echo {choose_k} ::: A B C D ::: A B C D
parallel --plus echo arg2 {2choose_k} arg1 {1choose_k} ::: A B C D ::: A B C D parallel --plus echo 2{2choose_k} 1{1choose_k} ::: A B C D ::: A B C D
B<{choose_k}> works for any number of input sources: B<{choose_k}> works for any number of input sources:
@ -3342,7 +3354,8 @@ If the input is in the file in.txt:
If the input is in the array $a here are two solutions: If the input is in the array $a here are two solutions:
seq $((${#a[@]}-1)) | env_parallel --env a echo '${a[{=$_--=}]} - ${a[{}]}' seq $((${#a[@]}-1)) | \
env_parallel --env a echo '${a[{=$_--=}]} - ${a[{}]}'
parallel echo {1} - {2} ::: "${a[@]::${#a[@]}-1}" :::+ "${a[@]:1}" parallel echo {1} - {2} ::: "${a[@]::${#a[@]}-1}" :::+ "${a[@]:1}"
@ -3370,7 +3383,7 @@ significant. Compare the speed of these:
If your program cannot take multiple arguments, then you can use GNU If your program cannot take multiple arguments, then you can use GNU
B<parallel> to spawn multiple GNU B<parallel>s: B<parallel> to spawn multiple GNU B<parallel>s:
seq -w 0 9999999 | seq -w 0 9999999 | \
parallel -j10 -q -I,, --pipe parallel -j0 touch pict{}.jpg parallel -j10 -q -I,, --pipe parallel -j0 touch pict{}.jpg
If B<-j0> normally spawns 252 jobs, then the above will try to spawn If B<-j0> normally spawns 252 jobs, then the above will try to spawn
@ -3465,7 +3478,8 @@ Check the uptime of the servers in I<~/.parallel/sshloginfile>:
Give each job a new color. Most terminals support ANSI colors with the Give each job a new color. Most terminals support ANSI colors with the
escape code "\033[30;3Xm" where 0 <= X <= 7: escape code "\033[30;3Xm" where 0 <= X <= 7:
parallel --tagstring '\033[30;3{=$_=++$::color%8=}m' seq {} ::: {1..10} seq 10 | \
parallel --tagstring '\033[30;3{=$_=++$::color%8=}m' seq {}
parallel --rpl '{color} $_="\033[30;3".(++$::color%8)."m"' \ parallel --rpl '{color} $_="\033[30;3".(++$::color%8)."m"' \
--tagstring {color} seq {} ::: {1..10} --tagstring {color} seq {} ::: {1..10}
@ -3587,7 +3601,7 @@ is much faster.
If it still does not fit in memory you can do this: If it still does not fit in memory you can do this:
parallel --pipepart -a regexps.txt --block 1M grep -Ff - -n bigfile | parallel --pipepart -a regexps.txt --block 1M grep -Ff - -n bigfile | \
sort -un | perl -pe 's/^\d+://' sort -un | perl -pe 's/^\d+://'
The 1M should be your free memory divided by the number of CPU threads and The 1M should be your free memory divided by the number of CPU threads and
@ -3599,7 +3613,7 @@ GNU/Linux you can do:
percpu=$((free / 200 / $(parallel --number-of-threads)))k percpu=$((free / 200 / $(parallel --number-of-threads)))k
parallel --pipepart -a regexps.txt --block $percpu --compress \ parallel --pipepart -a regexps.txt --block $percpu --compress \
grep -F -f - -n bigfile | grep -F -f - -n bigfile | \
sort -un | perl -pe 's/^\d+://' sort -un | perl -pe 's/^\d+://'
If you can live with duplicated lines and wrong order, it is faster to do: If you can live with duplicated lines and wrong order, it is faster to do:
@ -3612,8 +3626,8 @@ If you can live with duplicated lines and wrong order, it is faster to do:
If the CPU is the limiting factor parallelization should be done on If the CPU is the limiting factor parallelization should be done on
the regexps: the regexps:
cat regexp.txt | parallel --pipe -L1000 --round-robin --compress \ cat regexp.txt | parallel --pipe -L1000 --roundrobin --compress \
grep -f - -n bigfile | grep -f - -n bigfile | \
sort -un | perl -pe 's/^\d+://' sort -un | perl -pe 's/^\d+://'
The command will start one B<grep> per CPU and read I<bigfile> one The command will start one B<grep> per CPU and read I<bigfile> one
@ -3633,7 +3647,7 @@ these chunks. To parallelize both reading of I<bigfile> and I<regexp.txt>
combine the two using B<--fifo>: combine the two using B<--fifo>:
parallel --pipepart --block 100M -a bigfile --fifo cat regexp.txt \ parallel --pipepart --block 100M -a bigfile --fifo cat regexp.txt \
\| parallel --pipe -L1000 --round-robin grep -f - {} \| parallel --pipe -L1000 --roundrobin grep -f - {}
If a line matches multiple regexps, the line may be duplicated. If a line matches multiple regexps, the line may be duplicated.
@ -3672,7 +3686,7 @@ To run B<echo> on B<server.example.com>:
To run commands on more than one remote computer run: To run commands on more than one remote computer run:
seq 10 | parallel --sshlogin server.example.com,server2.example.net echo seq 10 | parallel --sshlogin s1.example.com,s2.example.net echo
Or: Or:
@ -3985,7 +3999,8 @@ is even faster:
DBURL=pg://user:pass@host/mydb DBURL=pg://user:pass@host/mydb
DBTABLEURL=$DBURL/mytable DBTABLEURL=$DBURL/mytable
parallel --sqlandworker $DBTABLEURL seq ::: {1..10} parallel --sqlandworker $DBTABLEURL seq ::: {1..10}
sql $DBURL "COPY (SELECT * FROM mytable) TO stdout DELIMITER ',' CSV HEADER;" sql $DBURL \
"COPY (SELECT * FROM mytable) TO stdout DELIMITER ',' CSV HEADER;"
Or MySQL: Or MySQL:
@ -4015,11 +4030,11 @@ can read into R or LibreCalc, then you can use B<--results>:
The show Aflyttet on Radio 24syv publishes an RSS feed with their audio The show Aflyttet on Radio 24syv publishes an RSS feed with their audio
podcasts on: http://arkiv.radio24syv.dk/audiopodcast/channel/4466232 podcasts on: http://arkiv.radio24syv.dk/audiopodcast/channel/4466232
Using B<xpath> you can extract the URLs for 2016 and download them Using B<xpath> you can extract the URLs for 2019 and download them
using GNU B<parallel>: using GNU B<parallel>:
wget -O - http://arkiv.radio24syv.dk/audiopodcast/channel/4466232 | wget -O - http://arkiv.radio24syv.dk/audiopodcast/channel/4466232 | \
xpath -e "//ancestor::pubDate[contains(text(),'2016')]/../enclosure/@url" | xpath -e "//pubDate[contains(text(),'2019')]/../enclosure/@url" | \
parallel -u wget '{= s/ url="//; s/"//; =}' parallel -u wget '{= s/ url="//; s/"//; =}'
@ -4124,7 +4139,8 @@ separator before each customer (column 2 = $F[1]). Here we first make
a 50 character random string, which we then use as the separator: a 50 character random string, which we then use as the separator:
sep=`perl -e 'print map { ("a".."z","A".."Z")[rand(52)] } (1..50);'` sep=`perl -e 'print map { ("a".."z","A".."Z")[rand(52)] } (1..50);'`
cat my.csv | perl -ape '$F[1] ne $l and print "'$sep'"; $l = $F[1]' | cat my.csv | \
perl -ape '$F[1] ne $l and print "'$sep'"; $l = $F[1]' | \
parallel --recend $sep --rrs --pipe -N1 wc parallel --recend $sep --rrs --pipe -N1 wc
If your program can process multiple customers replace B<-N1> with a If your program can process multiple customers replace B<-N1> with a
@ -4141,13 +4157,13 @@ process. That means that if you just spawn more GNU B<parallel>s then
each of them can run 250 jobs. This will spawn up to 2500 jobs: each of them can run 250 jobs. This will spawn up to 2500 jobs:
cat myinput |\ cat myinput |\
parallel --pipe -N 50 --round-robin -j50 parallel -j50 your_prg parallel --pipe -N 50 --roundrobin -j50 parallel -j50 your_prg
This will spawn up to 62500 jobs (use with caution - you need 64 GB This will spawn up to 62500 jobs (use with caution - you need 64 GB
RAM to do this, and you may need to increase /proc/sys/kernel/pid_max): RAM to do this, and you may need to increase /proc/sys/kernel/pid_max):
cat myinput |\ cat myinput |\
parallel --pipe -N 250 --round-robin -j250 parallel -j250 your_prg parallel --pipe -N 250 --roundrobin -j250 parallel -j250 your_prg
=head1 EXAMPLE: Working as mutex and counting semaphore =head1 EXAMPLE: Working as mutex and counting semaphore

View file

@ -2050,7 +2050,8 @@ be done by the user.
Stdout (standard output) is prepended with o:. Stderr (standard error) Stdout (standard output) is prepended with o:. Stderr (standard error)
is sendt to stdout (standard output) and prepended with e:. is sendt to stdout (standard output) and prepended with e:.
For short jobs with little output B<par> is 20% faster than GNU B<parallel>. For short jobs with little output B<par> is 20% faster than GNU
B<parallel> and 60% slower than B<xargs>.
http://savannah.nongnu.org/projects/par (Last checked: 2019-02) http://savannah.nongnu.org/projects/par (Last checked: 2019-02)
@ -2060,13 +2061,131 @@ http://savannah.nongnu.org/projects/par (Last checked: 2019-02)
B<fd> does not support composed commands, so commands must be wrapped B<fd> does not support composed commands, so commands must be wrapped
in B<sh -c>. in B<sh -c>.
It buffers output in RAM. It buffers output in RAM.
It only takes file names from the filesystem as input (similar to B<find>). It only takes file names from the filesystem as input (similar to B<find>).
https://github.com/sharkdp/fd (Last checked: 2019-02) https://github.com/sharkdp/fd (Last checked: 2019-02)
=head2 DIFFERENCES BETWEEN lateral AND GNU Parallel
B<lateral> is very similar to B<sem>: It takes a single command and
runs it in the background. The design means that output from parallel
running jobs may mix. If it dies unexpectly it leaves a socket in
~/.lateral/socket.PID.
B<lateral> deals badly with too long command lines. This makes the
B<lateral> server crash:
lateral run echo `seq 100000| head -c 1000k`
Any options will be read by B<lateral> so this does not work
(B<lateral> interprets the B<-l>):
lateral run ls -l
Composed commands do not work:
lateral run pwd ';' ls
Functions do not work:
myfunc() { echo a; }
export -f myfunc
lateral run myfunc
Running B<emacs> in the terminal causes the parent shell to die:
echo '#!/bin/bash' > mycmd
echo emacs -nw >> mycmd
chmod +x mycmd
lateral start
lateral run ./mycmd
Here are the examples from https://github.com/akramer/lateral with the
corresponding GNU B<sem> and GNU B<parallel> commands:
1$ lateral start
1$ for i in $(cat /tmp/names); do
1$ lateral run -- some_command $i
1$ done
1$ lateral wait
1$
1$ for i in $(cat /tmp/names); do
1$ sem some_command $i
1$ done
1$ sem --wait
1$
1$ parallel some_command :::: /tmp/names
2$ lateral start
2$ for i in $(seq 1 100); do
2$ lateral run -- my_slow_command < workfile$i > /tmp/logfile$i
2$ done
2$ lateral wait
2$
2$ for i in $(seq 1 100); do
2$ sem my_slow_command < workfile$i > /tmp/logfile$i
2$ done
2$ sem --wait
2$
2$ parallel 'my_slow_command < workfile{} > /tmp/logfile{}' \
::: {1..100}
3$ lateral start -p 0 # yup, it will just queue tasks
3$ for i in $(seq 1 100); do
3$ lateral run -- command_still_outputs_but_wont_spam inputfile$i
3$ done
3$ lateral config -p 10; lateral wait # command output spam can commence
3$
3$ for i in $(seq 1 100); do
3$ echo "command inputfile$i" >> joblist
3$ done
3$ parallel -j 10 :::: joblist
3$
3$ echo 1 > /tmp/njobs
3$ parallel -j /tmp/njobs command inputfile{} \
::: {1..100} &
3$ echo 10 >/tmp/njobs
3$ wait
https://github.com/akramer/lateral (Last checked: 2019-03)
=head2 DIFFERENCES BETWEEN with-this AND GNU Parallel
The examples from https://github.com/amritb/with-this.git and the
corresponding GNU B<parallel> command:
with -v "$(cat myurls.txt)" "curl -L this"
parallel curl -L ::: myurls.txt
with -v "$(cat myregions.txt)" \
"aws --region=this ec2 describe-instance-status"
parallel aws --region={} ec2 describe-instance-status \
:::: myregions.txt
with -v "$(ls)" "kubectl --kubeconfig=this get pods"
ls | parallel kubectl --kubeconfig={} get pods
with -v "$(ls | grep config)" "kubectl --kubeconfig=this get pods"
ls | grep config | parallel kubectl --kubeconfig={} get pods
with -v "$(echo {1..10})" "echo 123"
parallel -N0 echo 123 ::: {1..10}
Stderr is merged with stdout. B<with-this> buffers in RAM. It uses 3x
the output size, so you cannot have output larger than 1/3rd the
amount of RAM. The input values cannot contain spaces. Composed
commands do not work.
B<with-this> gives some additional information, so the output has to
be cleaned before piping it to the next command.
https://github.com/amritb/with-this.git (Last checked: 2019-03)
=head2 Todo =head2 Todo
Url for spread Url for spread
@ -2079,8 +2198,6 @@ https://github.com/bahmutov/with-package
https://github.com/xuchenCN/go-pssh https://github.com/xuchenCN/go-pssh
https://github.com/amritb/with-this.git
https://github.com/flesler/parallel https://github.com/flesler/parallel
https://github.com/Julian/Verge https://github.com/Julian/Verge

View file

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text"> <office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
<office:meta><meta:creation-date>2019-02-27T22:13:36.781924718</meta:creation-date><dc:date>2019-03-04T21:52:31.122787645</dc:date><meta:editing-duration>P4DT21H57M39S</meta:editing-duration><meta:editing-cycles>25</meta:editing-cycles><meta:generator>LibreOffice/6.0.6.2$Linux_X86_64 LibreOffice_project/00m0$Build-2</meta:generator><meta:print-date>2019-03-04T02:37:46.666605685</meta:print-date><meta:document-statistic meta:table-count="9" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="46" meta:word-count="304" meta:character-count="1719" meta:non-whitespace-character-count="1464"/></office:meta> <office:meta><meta:creation-date>2019-02-27T22:13:36.781924718</meta:creation-date><dc:date>2019-03-12T01:40:23.357999303</dc:date><meta:editing-duration>P11DT5H49M15S</meta:editing-duration><meta:editing-cycles>40</meta:editing-cycles><meta:generator>LibreOffice/6.0.6.2$Linux_X86_64 LibreOffice_project/00m0$Build-2</meta:generator><meta:print-date>2019-03-08T23:06:56.779293422</meta:print-date><meta:document-statistic meta:table-count="9" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="47" meta:word-count="337" meta:character-count="1950" meta:non-whitespace-character-count="1661"/></office:meta>
<office:settings> <office:settings>
<config:config-item-set config:name="ooo:view-settings"> <config:config-item-set config:name="ooo:view-settings">
<config:config-item config:name="ViewAreaTop" config:type="long">471</config:config-item> <config:config-item config:name="ViewAreaTop" config:type="long">15875</config:config-item>
<config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
<config:config-item config:name="ViewAreaWidth" config:type="long">22287</config:config-item> <config:config-item config:name="ViewAreaWidth" config:type="long">22287</config:config-item>
<config:config-item config:name="ViewAreaHeight" config:type="long">10515</config:config-item> <config:config-item config:name="ViewAreaHeight" config:type="long">11042</config:config-item>
<config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
<config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
<config:config-item-map-indexed config:name="Views"> <config:config-item-map-indexed config:name="Views">
<config:config-item-map-entry> <config:config-item-map-entry>
<config:config-item config:name="ViewId" config:type="string">view2</config:config-item> <config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
<config:config-item config:name="ViewLeft" config:type="long">8511</config:config-item> <config:config-item config:name="ViewLeft" config:type="long">18724</config:config-item>
<config:config-item config:name="ViewTop" config:type="long">2536</config:config-item> <config:config-item config:name="ViewTop" config:type="long">25474</config:config-item>
<config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item> <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
<config:config-item config:name="VisibleTop" config:type="long">471</config:config-item> <config:config-item config:name="VisibleTop" config:type="long">15875</config:config-item>
<config:config-item config:name="VisibleRight" config:type="long">22285</config:config-item> <config:config-item config:name="VisibleRight" config:type="long">22285</config:config-item>
<config:config-item config:name="VisibleBottom" config:type="long">10984</config:config-item> <config:config-item config:name="VisibleBottom" config:type="long">26915</config:config-item>
<config:config-item config:name="ZoomType" config:type="short">0</config:config-item> <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
<config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item> <config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item>
<config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
@ -41,7 +41,7 @@
<config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
<config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
<config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item> <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
<config:config-item config:name="PrinterSetup" config:type="base64Binary">lwH+/1hlcm94X1BoYXNlcl82MTQwRE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpYZXJveF9QaGFzZXJfNjE0MEROAAAAAAAAAAAWAAMAuAAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9WGVyb3hfUGhhc2VyXzYxNDBETgpvcmllbnRhdGlvbj1Qb3J0cmFpdApjb3BpZXM9MQpjb2xsYXRlPWZhbHNlCm1hcmdpbmRhanVzdG1lbnQ9MCwwLDAsMApjb2xvcmRlcHRoPTI0CnBzbGV2ZWw9MApwZGZkZXZpY2U9MQpjb2xvcmRldmljZT0wClBQRENvbnRleERhdGEKUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY=</config:config-item> <config:config-item config:name="PrinterSetup" config:type="base64Binary">uAH+/1hlcm94X1BoYXNlcl82MTQwRE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpYZXJveF9QaGFzZXJfNjE0MEROAAAAAAAAAAAWAAMA2QAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9WGVyb3hfUGhhc2VyXzYxNDBETgpvcmllbnRhdGlvbj1Qb3J0cmFpdApjb3BpZXM9MQpjb2xsYXRlPWZhbHNlCm1hcmdpbmRhanVzdG1lbnQ9MCwwLDAsMApjb2xvcmRlcHRoPTI0CnBzbGV2ZWw9MApwZGZkZXZpY2U9MQpjb2xvcmRldmljZT0wClBQRENvbnRleERhdGEKRHVwbGV4Ok5vbmUAUGFnZVNpemU6QTQASW5wdXRTbG90OkF1dG9TZWxlY3QAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY=</config:config-item>
<config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item> <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
<config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
<config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
@ -92,7 +92,7 @@
<config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
<config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item> <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
<config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
<config:config-item config:name="Rsid" config:type="int">1506730</config:config-item> <config:config-item config:name="Rsid" config:type="int">1662577</config:config-item>
<config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item> <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
<config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
<config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
@ -366,10 +366,10 @@
</style:table-properties> </style:table-properties>
</style:style> </style:style>
<style:style style:name="Table10.A" style:family="table-column"> <style:style style:name="Table10.A" style:family="table-column">
<style:table-column-properties style:column-width="2.5729in" style:rel-column-width="25185*"/> <style:table-column-properties style:column-width="2.3736in" style:rel-column-width="3418*"/>
</style:style> </style:style>
<style:style style:name="Table10.B" style:family="table-column"> <style:style style:name="Table10.B" style:family="table-column">
<style:table-column-properties style:column-width="4.1222in" style:rel-column-width="40350*"/> <style:table-column-properties style:column-width="4.3215in" style:rel-column-width="6223*"/>
</style:style> </style:style>
<style:style style:name="Table10.1" style:family="table-row"> <style:style style:name="Table10.1" style:family="table-row">
<style:table-row-properties style:min-row-height="0.1778in" fo:background-color="#000000" fo:keep-together="auto"> <style:table-row-properties style:min-row-height="0.1778in" fo:background-color="#000000" fo:keep-together="auto">
@ -611,30 +611,41 @@
<style:style style:name="P16" style:family="paragraph" style:parent-style-name="Standard"> <style:style style:name="P16" style:family="paragraph" style:parent-style-name="Standard">
<style:text-properties officeooo:paragraph-rsid="0015544e"/> <style:text-properties officeooo:paragraph-rsid="0015544e"/>
</style:style> </style:style>
<style:style style:name="P17" style:family="paragraph" style:parent-style-name="Table_20_Contents"> <style:style style:name="P17" style:family="paragraph" style:parent-style-name="Standard">
<style:text-properties officeooo:paragraph-rsid="0016fdaa"/> <style:paragraph-properties fo:text-align="end" style:justify-single-word="false"/>
<style:text-properties fo:font-size="6pt" officeooo:rsid="00180262" officeooo:paragraph-rsid="00180262" style:font-size-asian="6pt" style:font-size-complex="6pt"/>
</style:style> </style:style>
<style:style style:name="P18" style:family="paragraph" style:parent-style-name="Table_20_Contents"> <style:style style:name="P18" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:text-properties officeooo:paragraph-rsid="0016fdaa"/>
</style:style>
<style:style style:name="P19" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/> <style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/>
<style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Thorndale" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="bold" officeooo:rsid="0010bcb2" officeooo:paragraph-rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="bold" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Thorndale" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="bold" officeooo:rsid="0010bcb2" officeooo:paragraph-rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="bold" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="P19" style:family="paragraph" style:parent-style-name="Table_20_Contents"> <style:style style:name="P20" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:text-properties fo:font-weight="bold" officeooo:rsid="0016fdaa" officeooo:paragraph-rsid="0016fdaa" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" officeooo:rsid="0016fdaa" officeooo:paragraph-rsid="0016fdaa" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
<style:style style:name="P20" style:family="paragraph" style:parent-style-name="Table_20_Contents"> <style:style style:name="P21" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:text-properties fo:font-weight="bold" officeooo:paragraph-rsid="0016fdaa" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" officeooo:paragraph-rsid="0016fdaa" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
<style:style style:name="P21" style:family="paragraph" style:parent-style-name="Table_20_Contents"> <style:style style:name="P22" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:text-properties officeooo:rsid="0016fdaa" officeooo:paragraph-rsid="0016fdaa"/> <style:text-properties officeooo:rsid="0016fdaa" officeooo:paragraph-rsid="0016fdaa"/>
</style:style> </style:style>
<style:style style:name="P22" style:family="paragraph" style:parent-style-name="Table_20_Heading"> <style:style style:name="P23" style:family="paragraph" style:parent-style-name="Table_20_Contents">
<style:text-properties officeooo:paragraph-rsid="00180262"/>
</style:style>
<style:style style:name="P24" style:family="paragraph" style:parent-style-name="Table_20_Heading">
<style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/> <style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/>
<style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="001483d1" officeooo:paragraph-rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="001483d1" officeooo:paragraph-rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="P23" style:family="paragraph" style:parent-style-name="Table_20_Heading"> <style:style style:name="P25" style:family="paragraph" style:parent-style-name="Table_20_Heading">
<style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/> <style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/>
<style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="0015544e" officeooo:paragraph-rsid="0015544e" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="0015544e" officeooo:paragraph-rsid="0015544e" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="P26" style:family="paragraph" style:parent-style-name="Table_20_Heading">
<style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/>
<style:text-properties officeooo:paragraph-rsid="001483d1"/>
</style:style>
<style:style style:name="T1" style:family="text"> <style:style style:name="T1" style:family="text">
<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
@ -642,56 +653,83 @@
<style:text-properties fo:font-weight="bold" officeooo:rsid="0015544e" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties fo:font-weight="bold" officeooo:rsid="0015544e" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
<style:style style:name="T3" style:family="text"> <style:style style:name="T3" style:family="text">
<style:text-properties officeooo:rsid="0012b9fe"/> <style:text-properties fo:font-weight="bold" officeooo:rsid="00180262" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style> </style:style>
<style:style style:name="T4" style:family="text"> <style:style style:name="T4" style:family="text">
<style:text-properties fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/> <style:text-properties officeooo:rsid="0012b9fe"/>
</style:style> </style:style>
<style:style style:name="T5" style:family="text"> <style:style style:name="T5" style:family="text">
<style:text-properties fo:font-weight="normal" officeooo:rsid="001483d1" style:font-weight-asian="normal" style:font-weight-complex="normal"/> <style:text-properties fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
</style:style> </style:style>
<style:style style:name="T6" style:family="text"> <style:style style:name="T6" style:family="text">
<style:text-properties fo:font-weight="normal" officeooo:rsid="0015544e" style:font-weight-asian="normal" style:font-weight-complex="normal"/> <style:text-properties fo:font-weight="normal" officeooo:rsid="001483d1" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
</style:style> </style:style>
<style:style style:name="T7" style:family="text"> <style:style style:name="T7" style:family="text">
<style:text-properties officeooo:rsid="00137669"/> <style:text-properties fo:font-weight="normal" officeooo:rsid="0015544e" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
</style:style> </style:style>
<style:style style:name="T8" style:family="text"> <style:style style:name="T8" style:family="text">
<style:text-properties officeooo:rsid="001483d1"/> <style:text-properties fo:font-weight="normal" officeooo:rsid="0016fdaa" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
</style:style> </style:style>
<style:style style:name="T9" style:family="text"> <style:style style:name="T9" style:family="text">
<style:text-properties style:font-name="DejaVu Sans" officeooo:rsid="000ccaed"/> <style:text-properties officeooo:rsid="00137669"/>
</style:style> </style:style>
<style:style style:name="T10" style:family="text"> <style:style style:name="T10" style:family="text">
<style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="0010bcb2" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties officeooo:rsid="001483d1"/>
</style:style> </style:style>
<style:style style:name="T11" style:family="text"> <style:style style:name="T11" style:family="text">
<style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties style:font-name="DejaVu Sans" officeooo:rsid="000ccaed"/>
</style:style> </style:style>
<style:style style:name="T12" style:family="text"> <style:style style:name="T12" style:family="text">
<style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="001483d1" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="0010bcb2" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T13" style:family="text"> <style:style style:name="T13" style:family="text">
<style:text-properties officeooo:rsid="0015544e"/> <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T14" style:family="text"> <style:style style:name="T14" style:family="text">
<style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/> <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" officeooo:rsid="001483d1" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T15" style:family="text"> <style:style style:name="T15" style:family="text">
<style:text-properties style:font-name="Bitstream Vera Serif1" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-weight-asian="normal" style:font-weight-complex="normal"/> <style:text-properties officeooo:rsid="0015544e"/>
</style:style> </style:style>
<style:style style:name="T16" style:family="text"> <style:style style:name="T16" style:family="text">
<style:text-properties style:font-name="Bitstream Vera Serif1" fo:font-weight="bold" officeooo:rsid="0015544e" style:font-weight-asian="bold" style:font-weight-complex="bold"/> <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T17" style:family="text"> <style:style style:name="T17" style:family="text">
<style:text-properties officeooo:rsid="0016fdaa"/> <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="001483d1" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T18" style:family="text"> <style:style style:name="T18" style:family="text">
<style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/> <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="FreeSans" fo:font-size="12pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="600" officeooo:rsid="00195e71" style:font-size-asian="12pt" style:font-style-asian="normal" style:font-weight-asian="600" style:font-size-complex="12pt" style:font-style-complex="normal" style:font-weight-complex="600" style:text-overline-style="none" style:text-overline-color="font-color"/>
</style:style> </style:style>
<style:style style:name="T19" style:family="text"> <style:style style:name="T19" style:family="text">
<style:text-properties style:font-name="Bitstream Vera Serif1" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
</style:style>
<style:style style:name="T20" style:family="text">
<style:text-properties style:font-name="Bitstream Vera Serif1" fo:font-weight="bold" officeooo:rsid="0015544e" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style>
<style:style style:name="T21" style:family="text">
<style:text-properties officeooo:rsid="0016fdaa"/>
</style:style>
<style:style style:name="T22" style:family="text">
<style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>
</style:style>
<style:style style:name="T23" style:family="text">
<style:text-properties fo:font-style="italic" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-style-asian="italic" style:font-weight-asian="normal" style:font-style-complex="italic" style:font-weight-complex="normal"/> <style:text-properties fo:font-style="italic" fo:font-weight="normal" officeooo:rsid="0015544e" style:font-style-asian="italic" style:font-weight-asian="normal" style:font-style-complex="italic" style:font-weight-complex="normal"/>
</style:style> </style:style>
<style:style style:name="T24" style:family="text">
<style:text-properties officeooo:rsid="00180262"/>
</style:style>
<style:style style:name="T25" style:family="text">
<style:text-properties fo:font-style="normal" style:font-style-asian="normal" style:font-style-complex="normal"/>
</style:style>
<style:style style:name="T26" style:family="text">
<style:text-properties fo:font-style="normal" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>
</style:style>
<style:style style:name="T27" style:family="text">
<style:text-properties fo:font-style="normal" fo:font-weight="bold" officeooo:rsid="00180262" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>
</style:style>
<style:style style:name="T28" style:family="text">
<style:text-properties officeooo:rsid="00195e71"/>
</style:style>
<style:page-layout style:name="pm1"> <style:page-layout style:name="pm1">
<style:page-layout-properties fo:page-width="8.2701in" fo:page-height="11.6902in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in"> <style:page-layout-properties fo:page-width="8.2701in" fo:page-height="11.6902in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in">
<style:columns fo:column-count="1" fo:column-gap="0in"/> <style:columns fo:column-count="1" fo:column-gap="0in"/>
@ -720,12 +758,12 @@
<table:table-column table:style-name="Table7.A"/> <table:table-column table:style-name="Table7.A"/>
<table:table-row table:style-name="Table7.1"> <table:table-row table:style-name="Table7.1">
<table:table-cell table:style-name="Table7.A1" office:value-type="string"> <table:table-cell table:style-name="Table7.A1" office:value-type="string">
<text:p text:style-name="P15">GNU Para<text:span text:style-name="T18">ll</text:span>el Cheat Sheet</text:p> <text:p text:style-name="P15">GNU Para<text:span text:style-name="T22">ll</text:span>el Cheat Sheet</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table7.2"> <table:table-row table:style-name="Table7.2">
<table:table-cell table:style-name="Table7.A2" office:value-type="float" office:value="0"> <table:table-cell table:style-name="Table7.A2" office:value-type="float" office:value="0">
<text:p text:style-name="P6">GNU Parallel is a replacement for <text:span text:style-name="Source_20_Text"><text:span text:style-name="T18">xargs</text:span></text:span>, and <text:span text:style-name="Source_20_Text"><text:span text:style-name="T18">for</text:span></text:span> loops. It can also split a file or a stream into blocks and pass those to commands <text:span text:style-name="T13">running in parallel.</text:span></text:p> <text:p text:style-name="P6">GNU Parallel is a replacement for <text:span text:style-name="Source_20_Text"><text:span text:style-name="T22">xargs</text:span></text:span> and <text:span text:style-name="Source_20_Text"><text:span text:style-name="T22">for</text:span></text:span> loops. It can also split a file or a stream into blocks and pass those to commands <text:span text:style-name="T15">running in parallel.</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -734,22 +772,22 @@
<table:table-column table:style-name="Table8.A"/> <table:table-column table:style-name="Table8.A"/>
<table:table-row table:style-name="Table8.1"> <table:table-row table:style-name="Table8.1">
<table:table-cell table:style-name="Table8.A1" office:value-type="string"> <table:table-cell table:style-name="Table8.A1" office:value-type="string">
<text:p text:style-name="P13">Example<text:span text:style-name="T8">s</text:span></text:p> <text:p text:style-name="P13">Example<text:span text:style-name="T10">s</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table8.2"> <table:table-row table:style-name="Table8.2">
<table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0"> <table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0">
<text:p text:style-name="P12"><text:span text:style-name="T1">Compress all *.html files in parallel 2 per CPU thread</text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel --</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T11">jobs 200% </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">gzip ::: *.html</text:span></text:span></text:p> <text:p text:style-name="P12"><text:span text:style-name="T1">Compress all *.html files in parallel 2 </text:span><text:span text:style-name="T3">jobs </text:span><text:span text:style-name="T1">per CPU thread </text:span><text:span text:style-name="T3">in parallel</text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T12">parallel --</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T13">jobs 200% </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T12">gzip ::: *.html</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table8.3"> <table:table-row table:style-name="Table8.3">
<table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0"> <table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0">
<text:p text:style-name="P12"><text:span text:style-name="T1">Convert all *.wav to *.mp3 using </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T18">lame</text:span></text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel lame {} -o {.}.mp3 ::: *.wav</text:span></text:span></text:p> <text:p text:style-name="P23"><text:span text:style-name="T1">Convert all *.wav to *.mp3 using </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T22">lame</text:span></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T3">1</text:span><text:span text:style-name="T1"> job per CPU thread in parallel </text:span><text:span text:style-name="T3">(default)</text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T12">parallel lame {} -o {.}.mp3 ::: *.wav</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table8.4"> <table:table-row table:style-name="Table8.4">
<table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0"> <table:table-cell table:style-name="Table8.A2" office:value-type="float" office:value="0">
<text:p text:style-name="P12"><text:span text:style-name="T1">Chop bigfile into 1MB blocks and grep for the string foobar</text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T12">cat bigfile | </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel --pipe grep foobar</text:span></text:span></text:p> <text:p text:style-name="P12"><text:span text:style-name="T1">Chop bigfile into 1MB blocks and grep for the string foobar</text:span><text:line-break/><text:span text:style-name="Source_20_Text"><text:span text:style-name="T14">cat bigfile | </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T12">parallel --pipe grep foobar</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -763,32 +801,32 @@
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.2"> <table:table-row table:style-name="Table9.2">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">parallel echo ::: cmd line input source</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">parallel echo ::: cmd line input source</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.3"> <table:table-row table:style-name="Table9.3">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">cat input_from_stdin | parallel echo</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">cat input_from_stdin | parallel echo</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.4"> <table:table-row table:style-name="Table9.4">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">parallel echo ::: multiple input ::: source values</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">parallel echo ::: multiple input source</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T8">s ::: with </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">values</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.5"> <table:table-row table:style-name="Table9.5">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">parallel -a input_from_file echo</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">parallel -a input_from_file echo</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.6"> <table:table-row table:style-name="Table9.6">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">parallel echo :::: input_from_file</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">parallel echo :::: input_from_file</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table9.7"> <table:table-row table:style-name="Table9.7">
<table:table-cell table:style-name="Table9.A2" office:value-type="string"> <table:table-cell table:style-name="Table9.A2" office:value-type="string">
<text:p text:style-name="P10"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4">parallel echo :::: input_from_file ::: and command line</text:span></text:span></text:p> <text:p text:style-name="P10"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5">parallel echo :::: input_from_file ::: and command line</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -801,7 +839,7 @@
<text:p text:style-name="P13">Replacement string</text:p> <text:p text:style-name="P13">Replacement string</text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B1" office:value-type="string"> <table:table-cell table:style-name="Table10.B1" office:value-type="string">
<text:p text:style-name="P13">Value</text:p> <text:p text:style-name="P26"><text:span text:style-name="T16">Value </text:span><text:span text:style-name="T18">if input is mydir/mysubdir/myfile.myext</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.2"> <table:table-row table:style-name="Table10.2">
@ -822,10 +860,10 @@
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.4"> <table:table-row table:style-name="Table10.4">
<table:table-cell table:style-name="Table10.A2" office:value-type="string"> <table:table-cell table:style-name="Table10.A2" office:value-type="string">
<text:p text:style-name="P17"><text:span text:style-name="Source_20_Text">{/}, {//}, </text:span><text:span text:style-name="Source_20_Text">{/.}</text:span></text:p> <text:p text:style-name="P18"><text:span text:style-name="Source_20_Text">{/}, {//}, </text:span><text:span text:style-name="Source_20_Text">{/.}</text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P17"><text:span text:style-name="Source_20_Text">myfile.myext, mydir/mysubdir, </text:span><text:span text:style-name="Source_20_Text">myfile</text:span></text:p> <text:p text:style-name="P18"><text:span text:style-name="Source_20_Text">myfile.myext, mydir/mysubdir, </text:span><text:span text:style-name="Source_20_Text">myfile</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.5"> <table:table-row table:style-name="Table10.5">
@ -833,7 +871,7 @@
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text">{#}</text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text">{#}</text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P8"><text:span text:style-name="T3">T</text:span>he sequence number of the job</text:p> <text:p text:style-name="P8"><text:span text:style-name="T4">T</text:span>he sequence number of the job</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.6"> <table:table-row table:style-name="Table10.6">
@ -841,7 +879,7 @@
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text">{%}</text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text">{%}</text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P8"><text:span text:style-name="T3">T</text:span>he job slot number</text:p> <text:p text:style-name="P8"><text:span text:style-name="T4">T</text:span>he job slot number</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.7"> <table:table-row table:style-name="Table10.7">
@ -849,20 +887,20 @@
<text:p text:style-name="P5"><text:span text:style-name="Source_20_Text">{2}</text:span></text:p> <text:p text:style-name="P5"><text:span text:style-name="Source_20_Text">{2}</text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P7"><text:span text:style-name="T17">Value from the s</text:span>econd input source</text:p> <text:p text:style-name="P7"><text:span text:style-name="T21">Value from the s</text:span>econd input source</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.8"> <table:table-row table:style-name="Table10.8">
<table:table-cell table:style-name="Table10.A2" office:value-type="string"> <table:table-cell table:style-name="Table10.A2" office:value-type="string">
<text:p text:style-name="P5"><text:span text:style-name="Source_20_Text">{2.} </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T17">{2/} {2//} {2/.}</text:span></text:span></text:p> <text:p text:style-name="P5"><text:span text:style-name="Source_20_Text">{2.} </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T21">{2/} {2//} {2/.}</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P7">Comb<text:span text:style-name="T17">ination </text:span>of {2} and {.} <text:span text:style-name="T17">{/} {//} {/.}</text:span></text:p> <text:p text:style-name="P7">Comb<text:span text:style-name="T21">ination </text:span>of {2} and {.} <text:span text:style-name="T21">{/} {//} {/.}</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table10.9"> <table:table-row table:style-name="Table10.9">
<table:table-cell table:style-name="Table10.A2" office:value-type="string"> <table:table-cell table:style-name="Table10.A2" office:value-type="string">
<text:p text:style-name="P9"><text:span text:style-name="Source_20_Text">{= perl </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T13">expression</text:span></text:span><text:span text:style-name="Source_20_Text"> =}</text:span></text:p> <text:p text:style-name="P9"><text:span text:style-name="Source_20_Text">{= perl </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T15">expression</text:span></text:span><text:span text:style-name="Source_20_Text"> =}</text:span></text:p>
</table:table-cell> </table:table-cell>
<table:table-cell table:style-name="Table10.B2" office:value-type="string"> <table:table-cell table:style-name="Table10.B2" office:value-type="string">
<text:p text:style-name="P7">Change $_ with perl expression</text:p> <text:p text:style-name="P7">Change $_ with perl expression</text:p>
@ -874,12 +912,12 @@
<table:table-column table:style-name="Table11.A"/> <table:table-column table:style-name="Table11.A"/>
<table:table-row table:style-name="Table11.1"> <table:table-row table:style-name="Table11.1">
<table:table-cell table:style-name="Table11.A1" office:value-type="string"> <table:table-cell table:style-name="Table11.A1" office:value-type="string">
<text:p text:style-name="P13">Control the output <text:span text:style-name="T8">keep the order the same as the input</text:span></text:p> <text:p text:style-name="P13">Control the output <text:span text:style-name="T10">keep the same order as the input, prepend with input value</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table11.2"> <table:table-row table:style-name="Table11.2">
<table:table-cell table:style-name="Table11.A2" office:value-type="string"> <table:table-cell table:style-name="Table11.A2" office:value-type="string">
<text:p text:style-name="P17"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T8">parallel --keep-order &quot;sleep {}; echo {}&quot; ::: 5 4 3 2 1</text:span></text:span></text:p> <text:p text:style-name="P18"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel --keep-order --tag &quot;sleep {}; echo {}&quot; ::: 5 4 3 2 1</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -893,14 +931,14 @@
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table12.3"> <table:table-row table:style-name="Table12.3">
<table:table-cell table:style-name="Table12.A2" office:value-type="string"> <table:table-cell table:style-name="Table12.A2" office:value-type="string">
<text:p text:style-name="P19">Run 2 jobs in parallel</text:p> <text:p text:style-name="P20">Run 2 jobs in parallel <text:span text:style-name="T24">command is a composed command</text:span></text:p>
<text:p text:style-name="P17"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T8">parallel --jobs 2 &quot;sleep {}; echo {}&quot; ::: 5 4 3 2 1</text:span></text:span></text:p> <text:p text:style-name="P18"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel --jobs 2 &quot;sleep {}; echo {}&quot; ::: 5 4 3 2 1</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table12.3"> <table:table-row table:style-name="Table12.3">
<table:table-cell table:style-name="Table12.A2" office:value-type="string"> <table:table-cell table:style-name="Table12.A2" office:value-type="string">
<text:p text:style-name="P19">See what will be run</text:p> <text:p text:style-name="P20">See what will be run</text:p>
<text:p text:style-name="P21"><text:span text:style-name="Source_20_Text">parallel --dryrun echo ::: Red Green Blue ::: S M L</text:span></text:p> <text:p text:style-name="P22"><text:span text:style-name="Source_20_Text">parallel --dryrun echo </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T28">{2} {1} </text:span></text:span><text:span text:style-name="Source_20_Text">::: </text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T28">bird flower fish ::: </text:span></text:span><text:span text:style-name="Source_20_Text">Red Green Blue</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -909,12 +947,12 @@
<table:table-column table:style-name="Table13.A"/> <table:table-column table:style-name="Table13.A"/>
<table:table-row table:style-name="Table13.1"> <table:table-row table:style-name="Table13.1">
<table:table-cell table:style-name="Table13.A1" office:value-type="string"> <table:table-cell table:style-name="Table13.A1" office:value-type="string">
<text:p text:style-name="P22">Remote execution</text:p> <text:p text:style-name="P24">Remote execution</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table13.2"> <table:table-row table:style-name="Table13.2">
<table:table-cell table:style-name="Table13.A2" office:value-type="string"> <table:table-cell table:style-name="Table13.A2" office:value-type="string">
<text:p text:style-name="P17"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T8">parallel -S server1 -S server2 &quot;hostname; echo {}&quot; ::: foo bar </text:span></text:span></text:p> <text:p text:style-name="P18"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">parallel -S server1 -S server2 &quot;hostname; echo {}&quot; ::: foo bar </text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -923,17 +961,17 @@
<table:table-column table:style-name="Table1.A"/> <table:table-column table:style-name="Table1.A"/>
<table:table-row table:style-name="Table1.1"> <table:table-row table:style-name="Table1.1">
<table:table-cell table:style-name="Table1.A1" office:value-type="string"> <table:table-cell table:style-name="Table1.A1" office:value-type="string">
<text:p text:style-name="P22">Pipe mode</text:p> <text:p text:style-name="P24">Pipe mode</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table1.2"> <table:table-row table:style-name="Table1.2">
<table:table-cell table:style-name="Table1.A2" office:value-type="string"> <table:table-cell table:style-name="Table1.A2" office:value-type="string">
<text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T8">cat bigfile | parallel --pipe wc -l</text:span></text:span></text:p> <text:p text:style-name="P11"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T10">cat bigfile | parallel --pipe wc -l</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table1.3"> <table:table-row table:style-name="Table1.3">
<table:table-cell table:style-name="Table1.A2" office:value-type="string"> <table:table-cell table:style-name="Table1.A2" office:value-type="string">
<text:p text:style-name="P4"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T16">Chop bigfile into one block per CPU thread and </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T19">grep</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T16"> for foobar</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T4"><text:line-break/>parallel -a bigfile --pipepart --block -1 grep foobar</text:span></text:span></text:p> <text:p text:style-name="P4"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T20">Chop bigfile into one block per CPU thread and </text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T23">grep</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T20"> for foobar</text:span></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T5"><text:line-break/>parallel -a bigfile --pipepart --block -1 grep foobar</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
@ -942,23 +980,21 @@
<table:table-column table:style-name="Table2.A"/> <table:table-column table:style-name="Table2.A"/>
<table:table-row table:style-name="Table2.1"> <table:table-row table:style-name="Table2.1">
<table:table-cell table:style-name="Table2.A1" office:value-type="string"> <table:table-cell table:style-name="Table2.A1" office:value-type="string">
<text:p text:style-name="P23">Read more <text:span text:style-name="T17">Your command line will love you for it</text:span></text:p> <text:p text:style-name="P25">Read more <text:span text:style-name="T21">Your command line will love you for it</text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table2.3"> <table:table-row table:style-name="Table2.3">
<table:table-cell table:style-name="Table2.A2" office:value-type="string"> <table:table-cell table:style-name="Table2.A2" office:value-type="string">
<text:p text:style-name="P20"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T17">parallel --help; <text:s/></text:span></text:span><text:span text:style-name="Source_20_Text">man parallel; <text:s/></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T17">man parallel_tutorial</text:span></text:span></text:p> <text:p text:style-name="P21"><text:span text:style-name="Source_20_Text"><text:span text:style-name="T21">parallel --help; <text:s/></text:span></text:span><text:span text:style-name="Source_20_Text">man parallel; <text:s/></text:span><text:span text:style-name="Source_20_Text"><text:span text:style-name="T21">man parallel_tutorial; <text:s/>www.pi.dk/1</text:span></text:span></text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
<table:table-row table:style-name="Table2.3"> <table:table-row table:style-name="Table2.3">
<table:table-cell table:style-name="Table2.A2" office:value-type="string"> <table:table-cell table:style-name="Table2.A2" office:value-type="string">
<text:p text:style-name="P6"><text:span text:style-name="T13">GNU Parallel 2018 </text:span>https://doi.org/10.5281/zenodo.1146014</text:p> <text:p text:style-name="P6"><text:span text:style-name="T15">GNU Parallel 2018 </text:span>https://doi.org/10.5281/zenodo.1146014</text:p>
</table:table-cell> </table:table-cell>
</table:table-row> </table:table-row>
</table:table> </table:table>
<text:p text:style-name="P1"/> <text:p text:style-name="P17">(CC-By-SA) 2019-03-<text:span text:style-name="T28">11</text:span> Ole Tange</text:p>
<text:p text:style-name="P1"/>
<text:p text:style-name="P1"/>
<text:p text:style-name="P1"/> <text:p text:style-name="P1"/>
</office:text> </office:text>
</office:body> </office:body>

View file

@ -2395,13 +2395,13 @@ Output (the order may be different):
GNU B<parallel> treats each line as a record. If the order of records GNU B<parallel> treats each line as a record. If the order of records
is unimportant (e.g. you need all lines processed, but you do not care is unimportant (e.g. you need all lines processed, but you do not care
which is processed first), then you can use B<--round-robin>. Without which is processed first), then you can use B<--roundrobin>. Without
B<--round-robin> GNU B<parallel> will start a command per block; with B<--roundrobin> GNU B<parallel> will start a command per block; with
B<--round-robin> only the requested number of jobs will be started B<--roundrobin> only the requested number of jobs will be started
(B<--jobs>). The records will then be distributed between the running (B<--jobs>). The records will then be distributed between the running
jobs: jobs:
cat num1000000 | parallel --pipe -j4 --round-robin wc cat num1000000 | parallel --pipe -j4 --roundrobin wc
Output will be similar to: Output will be similar to:

View file

@ -44,7 +44,7 @@ the files.
=head2 Simple line buffered output =head2 Simple line buffered output
GNU Parallel saves output to tempfiles. If the amount of data is GNU B<parallel> saves output to tempfiles. If the amount of data is
bigger than the free disk space, then you can use this technique to do bigger than the free disk space, then you can use this technique to do
line buffering without saving to disk: line buffering without saving to disk:

View file

@ -941,6 +941,11 @@ par_shard() {
perl -pe 's/(.*\d{5,}){3}/OK/' perl -pe 's/(.*\d{5,}){3}/OK/'
} }
par_fish() {
echo '### https://github.com/fish-shell/fish-shell/issues/5582'
echo OK | stdout fish -c 'parallel --pipe cat'
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel --timeout 30 -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' parallel --timeout 30 -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -2232,6 +2232,19 @@ CPU revision : 4
:::+ "2-8-8-8" "1-4-8-4" "1-2-4-2" "1-2-2-2" "2-24-48-24" "1-2-2-2" "1-8-8-8" :::+ "2-8-8-8" "1-4-8-4" "1-2-4-2" "1-2-2-2" "2-24-48-24" "1-2-2-2" "1-8-8-8"
} }
par_null_resume() {
echo '### --null --resume --jl'
log=/tmp/null-resume-$$.log
true > "$log"
printf "%s\n" a b c | parallel --resume -k --jl $log echo
printf "%s\n" a b c | parallel --resume -k --jl $log echo
true > "$log"
printf "%s\0" A B C | parallel --null --resume -k --jl $log echo
printf "%s\0" A B C | parallel --null --resume -k --jl $log echo
rm "$log"
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -4,11 +4,11 @@
# Each should be taking 30-100s and be possible to run in parallel # Each should be taking 30-100s and be possible to run in parallel
# I.e.: No race conditions, no logins # I.e.: No race conditions, no logins
par_sigterm() { par_sighup() {
echo '### Test SIGTERM' echo '### Test SIGHUP'
parallel -k -j5 sleep 15';' echo ::: {1..99} >/tmp/parallel$$ 2>&1 & parallel -k -j5 sleep 15';' echo ::: {1..99} >/tmp/parallel$$ 2>&1 &
A=$! A=$!
sleep 29; kill -TERM $A sleep 29; kill -HUP $A
wait wait
LC_ALL=C sort /tmp/parallel$$ LC_ALL=C sort /tmp/parallel$$
rm /tmp/parallel$$ rm /tmp/parallel$$

View file

@ -46,8 +46,8 @@ par_slow_args_generation() {
seq 1 3 | parallel -j1 "sleep 2; echo {}" | parallel -kj2 echo seq 1 3 | parallel -j1 "sleep 2; echo {}" | parallel -kj2 echo
} }
par_kill_term_twice() { par_kill_term() {
echo '### Are children killed if GNU Parallel receives TERM twice? There should be no sleep at the end' echo '### Are children killed if GNU Parallel receives TERM? There should be no sleep at the end'
parallel -q bash -c 'sleep 120 & pid=$!; wait $pid' ::: 1 & parallel -q bash -c 'sleep 120 & pid=$!; wait $pid' ::: 1 &
T=$! T=$!
@ -56,8 +56,17 @@ par_kill_term_twice() {
kill -TERM $T kill -TERM $T
sleep 1 sleep 1
pstree $$ pstree $$
kill -TERM $T }
sleep 1
par_kill_hup() {
echo '### Are children killed if GNU Parallel receives HUP? There should be no sleep at the end'
parallel -j 2 -q bash -c 'sleep {} & pid=$!; wait $pid' ::: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 &
T=$!
sleep 2
pstree $$
kill -HUP $T
sleep 2
pstree $$ pstree $$
} }

View file

@ -412,6 +412,8 @@ par_file_ending_in_newline ### Hans found a bug giving unitialized variable
par_file_ending_in_newline gzip /tmp/parallel_f1 par_file_ending_in_newline gzip /tmp/parallel_f1
par_file_ending_in_newline gzip '/tmp/parallel_f2 par_file_ending_in_newline gzip '/tmp/parallel_f2
par_file_ending_in_newline ' par_file_ending_in_newline '
par_fish ### https://github.com/fish-shell/fish-shell/issues/5582
par_fish OK
par_halt_on_error_division_by_zero ### --halt-on-error soon,fail=100% with no input should not give division by zero par_halt_on_error_division_by_zero ### --halt-on-error soon,fail=100% with no input should not give division by zero
par_halt_on_error_division_by_zero 0 par_halt_on_error_division_by_zero 0
par_halt_one_job # Halt soon if there is a single job par_halt_one_job # Halt soon if there is a single job

View file

@ -409,7 +409,7 @@ par_test_build_and_install rm /tmp/parallel-install/bin/sem || true
par_test_build_and_install ln -s parallel /tmp/parallel-install/bin/sem par_test_build_and_install ln -s parallel /tmp/parallel-install/bin/sem
par_test_build_and_install make[0]: Leaving directory '/tmp/parallel-00000000/src' par_test_build_and_install make[0]: Leaving directory '/tmp/parallel-00000000/src'
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/doc/parallel' par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/doc/parallel'
par_test_build_and_install /usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf '/tmp/parallel-install/share/doc/parallel' par_test_build_and_install /usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf parallel_cheat.pdf '/tmp/parallel-install/share/doc/parallel'
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/man/man1' par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/man/man1'
par_test_build_and_install /usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/tmp/parallel-install/share/man/man1' par_test_build_and_install /usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/tmp/parallel-install/share/man/man1'
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/man/man7' par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/man/man7'
@ -823,7 +823,7 @@ par_test_build_and_install || echo "Warning: pod2pdf not found. Using old parset
par_test_build_and_install /bin/bash: pod2pdf: command not found par_test_build_and_install /bin/bash: pod2pdf: command not found
par_test_build_and_install Warning: pod2pdf not found. Using old parset.pdf par_test_build_and_install Warning: pod2pdf not found. Using old parset.pdf
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/doc/parallel' par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/share/doc/parallel'
par_test_build_and_install /usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf '/tmp/parallel-install/share/doc/parallel' par_test_build_and_install /usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf parallel_cheat.pdf '/tmp/parallel-install/share/doc/parallel'
par_test_build_and_install pod2man --release='00000000' --center='parallel' \ par_test_build_and_install pod2man --release='00000000' --center='parallel' \
par_test_build_and_install --section=1 ./parallel.pod > ./parallel.1n \ par_test_build_and_install --section=1 ./parallel.pod > ./parallel.1n \
par_test_build_and_install && mv ./parallel.1n ./parallel.1 \ par_test_build_and_install && mv ./parallel.1n ./parallel.1 \

View file

@ -27,8 +27,8 @@ par_interactive sleep 0.1; echo opt-p 2 ?...n
par_interactive sleep 0.1; echo opt-p 3 ?...y par_interactive sleep 0.1; echo opt-p 3 ?...y
par_interactive spawn /tmp/parallel-script-for-expect par_interactive spawn /tmp/parallel-script-for-expect
par_k ### Test -k par_k ### Test -k
par_k parallel: Warning: Only enough file handles to run 9 jobs in parallel. par_k parallel: Warning: Only enough file handles to run 8 jobs in parallel.
par_k parallel: Warning: Running 'parallel -j0 -N 9 --pipe parallel -j0' or par_k parallel: Warning: Running 'parallel -j0 -N 8 --pipe parallel -j0' or
par_k parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf par_k parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
par_k parallel: Warning: or /proc/sys/fs/file-max may help. par_k parallel: Warning: or /proc/sys/fs/file-max may help.
par_k begin par_k begin

View file

@ -172,6 +172,13 @@ par_incomplete_linebuffer 7
par_incomplete_linebuffer 8 par_incomplete_linebuffer 8
par_incomplete_linebuffer 9 par_incomplete_linebuffer 9
par_incomplete_linebuffer 10 par_incomplete_linebuffer 10
par_null_resume ### --null --resume --jl
par_null_resume a
par_null_resume b
par_null_resume c
par_null_resume A
par_null_resume B
par_null_resume C
par_parset ### test parset par_parset ### test parset
par_parset Put output into $myarray par_parset Put output into $myarray
par_parset 10 par_parset 10

View file

@ -60,7 +60,9 @@ This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing. If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
More about funding GNU Parallel and the citation notice: More about funding GNU Parallel and the citation notice:
https://lists.gnu.org/archive/html/parallel/2013-11/msg00006.html
https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
If you send a copy of your published article to tange@gnu.org, it will be If you send a copy of your published article to tange@gnu.org, it will be
mentioned in the release notes of next version of GNU Parallel. mentioned in the release notes of next version of GNU Parallel.