我正在尝试将一个非常大的文件拆分为每行一个新文件。
为什么?它将作为 Mahout 的输入。但是有太多的行,没有足够的后缀进行拆分。
有没有办法在 bash 中做到这一点?
如果你坚持使用拆分,那么你必须增加你的后缀长度。例如,假设您的文件中有 10,000 行:
split --suffix-length=5 --lines=1 foo.txt
如果你真的想用这种方法发疯,你甚至可以使用wc命令和一些 shell 算法动态设置后缀长度。例如:
file='foo.txt'
split \
--suffix-length=$(( $(wc --chars < <(wc --lines < "$file")) - 1 )) \
--lines=1 \
"$file"
但是,无论如何,上述内容实际上只是一个杂牌。更正确的解决方案是使用GNU findutils 包中的xargs每行调用一次命令。例如:
xargs --max-lines=1 --arg-file=foo.txt your_command
这将一次将一行传递给您的命令。这是一种更加灵活的方法,将大大减少您的磁盘 I/O。
split --lines=1 --suffix-length=5 input.txt output.
这将使用每个后缀 5 个字符,这对于 26个 5 = 11881376 个文件来说已经足够了。如果你真的有更多,增加后缀长度。
这是为每一行做一些事情的另一种方法:
while IFS= read -r line; do
do_something_with "$line"
done < big.file
GNU Parallel 可以做到这一点:
cat big.file | parallel --pipe -N1 'cat > {#}'
但是如果 Mahout 可以从标准输入读取,那么您可以避免临时文件:
cat big.file | parallel --pipe -N1 mahout --input-file -
了解有关 GNU Parallel的更多信息https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1并浏览教程:http ://www.gnu.org/software/parallel/parallel_tutorial.html