# 对一个大文件中的列进行求和
cat rands20M.txt | parallel --pipe -q awk '{s+=$1} END {print s}' | awk '{s+=$1} END {print s}'
# block默认1M,可以指定
cat rands20M.txt | parallel --block 2M --pipe -q awk '{s+=$1} END {print s}'

# bzip2不指定文件时,压缩或者解压都是从标准输入到标准输出
cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressed.bz2

# 统计每个ip出现的次数,每行一个
zcat < file.gz | parallel --pipe -q awk '{ sum[$1] += 1; } END { for (i in sum) { print i, sum[i]; }}' | awk '{ sum[$1] += $2; } END { for (i in sum) { print i, sum[i]; }}' | sort -k1 > stats.txt

zcat < file.gz | awk '{print $1}' | sort -k 1 | uniq -c | awk '{print $2, $1}' > stats.txt

相关参数

-k            #保持顺序
-q            #quote后续命令,省略掉很多需要用反斜杠转义的地方
--pipe        #将来自管道的输入传递给命令
--recend      #技术结束标记

非常有必要通读一遍man parallel_tutorial的内容,而我确实也已经这么做了,耗时2个小时左右,很有价值。

源码安装

# 通过源代码安装 http://git.savannah.gnu.org/cgit/parallel.git/tree/README
wget http://ftpmirror.gnu.org/parallel/parallel-20170322.tar.bz2
bzip2 -dc parallel-20170322.tar.bz2 | tar xvf -
cd parallel-20170322
./configure && make && sudo make install

# 安装完成之后,如果使用报错
parallel: Error: --tollef has been retired.
parallel: Error: Remove --tollef or use --gnu to override --tollef.
# 检查/etc/parallel/config文件,是不是有个--tollef选项,删掉即可。

参考链接