GNU Parallel – The command line power tool
slideshare.net
slideshare.net
Recently the developers fixed a major bug for me, that child jobs on other nodes would not be killed when parallel was killed. This was the only thing stopping me from recommending it to my labmates, now there's no reason not to use it!
I used to use ppss, which does the core task just as well, but the interface is more complex.
I mostly use these tools to optimize large numbers of PNGs before deployment, using optipng, pngout, and/or my own lossypng. These programs take a while to run so using all my cores gets the job done a lot quicker.
$ mkdir a
$ cd a
$ touch b c d e
$ find -type f | xargs echo rm
rm ./b ./d ./e ./c
$ ls
b c d e
$ find -type f | xargs rm
$ ls
$ $ touch 'Ham
Jam
Spam'
$ touch 'J.R. "Bob" Dobbs'
$ find . -type f -print0 | parallel -n1 -0 --dry-run echo
echo ./Ham'
'Jam'
'Spam
echo ./J.R.\ \"Bob\"\ Dobbs
$ find . -type f -print0 | xargs -n1 -0 echo echo
echo ./Ham
Jam
Spam
echo ./J.R. "Bob" Dobbs
For my own "dry runs", though, I've always preferred passing the command line to #include <stdio.h>
int main(int argc, char* argv[]) {
char** argp;
int i;
printf("argc = %d\n", argc);
for (i = 0, argp = argv; *argp != 0; ++argp, ++i) {
printf("argv[%d] = %s\n", i, *argp);
}
return 0;
}
to remove all reasonable doubt. echo './Ham
Jam
Spam'
but your output looks different. As an example of how it should look, try this: $ find . -type f -print0 | xargs -n1 -0 perl -e'print "\"$_\" " for (@ARGV)'
"./Ham
Jam
Spam"./Ham' 'Jam' 'Spam
would be identical to ./Ham\nJam\nSpam (if \n were the correct translation to the newline in this case) or './Ham Jam Spam'
This would be identical to what you wrote, but only punts to quotes when it doesn't have a canonical method of representing the character otherwise. The fact that you don't need to explicitly concatenate two strings in the shell may be what's throwing you off?
Interestingly enough, 'Ham\n\nJam\nSpam' becomes
./Ham' '' 'Jam' 'Spam
So parallel is just literally outputting all newlines using quotes. I believe this would be identical, if you analyzed it and saw that two newlines are next to each other:
./Ham'
'Spam' 'Jam
You can simply re-run that piped to bash (or your shell of choice) to execute commands if you wish (say, if parallel isn't available).
E.g.,
echo foo bar baz | xargs -n1 -t echo ls | bash
... will execute 'ls foo; ls bar; ls baz', while showing the expanded command.http://www.luga.de/Angebote/Vortraege/GNU_Parallel_LIT_2011/...
$ cat ips.txt | sort | uniq -c | sort -rn
3 127.0.0.1
2 192.168.1.1
1 192.168.1.2
Now i want to reformat the output of uniq -c, i want the count to the last column: $ cat ips.txt | sort | uniq -c | sort -rn | parallel --colsep ' ' echo {2} {1}
But gives empty output.. what gives?
It only works if I double pipe it thru parallel like this: $ cat ips.txt | sort | uniq -c | sort -rn | \
parallel --trim lr echo | parallel --colsep ' ' echo {2} {1}
127.0.0.1 3
192.168.1.1 2
192.168.1.2 1 parallel --colsep ' +' echo {2} {3}
or: parallel --colsep ' ' echo {7} {8}https://github.com/jftuga/Windows/tree/master/mp
The only file you need to download is mp.exe. Source code is mp.au3.
cat urls | parallel --jobs 4 --load 6 'curl -s -w "%{time_total}\n" -o /dev/null {}'