我有一个文本文件infile.txt
像这样:
abc what's the foo bar.
foobar hello world, hhaha cluster spatio something something.
xyz trying to do this in parallel
kmeans you're mean, who's mean?
文件中的每一行都将被这个 perl 命令处理到 out.txt 中
`cat infile.txt | perl dosomething > out.txt`
想象一下,如果文本文件有 100,000,000 行。我想并行化 bash 命令,所以我尝试了这样的操作:
$ mkdir splitfiles
$ mkdir splitfiles_processed
$ cd splitfiles
$ split -n3 ../infile.txt
$ for i in $(ls); do "cat $i | perl dosomething > ../splitfiles_processed/$i &"; done
$ wait
$ cd ../splitfiles_processed
$ cat * > ../infile_processed.txt
但是有没有更简洁的方法来完成同样的事情呢?
@Ulfalizer 的答案为您提供了有关解决方案的良好提示,但缺少一些细节。
您可以使用GNU并行 http://www.gnu.org/software/parallel/ (apt-get install parallel
在 Debian 上)
所以你的问题可以使用以下命令来解决:
cat infile.txt | parallel -l 1000 -j 10 -k --spreadstdin perl dosomething > result.txt
以下是参数的含义:
-l 1000: send 1000 lines blocks to command
-j 10: launch 10 jobs in parallel
-k: keep sequence of output
--spreadstdin: sends the above 1000 line block to the stdin of the command
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)