【发布时间】:2015-05-15 23:33:09
【问题描述】:
我有一个文本文件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
但是有没有更简洁的方法来做同样的事情?
【问题讨论】:
-
为什么还要拆分呢?还有一个
cat滥用。perl可以就地修改,也可以做备份。 -
听起来像是 XY 问题。您真正想要解决的问题是什么导致您想要使用这种类型的解决方案?
-
将
cat ... | ...视为# do something。我需要拆分一个文件以分段处理它,然后将处理后的部分缝合回一个文件。我无法控制#do something,所以我给它一个文本文件,它输出一个处理过的文本文件。 -
您有一个可行的解决方案。您可能找不到更简单的 MAP/REDUCE 实现。八行 shell 代码并不是一个冗长的解决方案。