我想将一个非常大的文件分割成每行一个新文件。
为什么?因为这将作为Mahout的输入。但是行数太多,而分割后缀不足。
有没有办法在bash中实现这个功能?
如果您坚持使用split函数,则必须增加后缀长度。例如,假设您的文件中有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。
xargs --max-lines=1 --arg-file=foo.txt /bin/echo
。请注意使用二进制文件的路径而不是使用 shell 内置命令。 - Todd A. Jacobssplit --lines=1 --suffix-length=5 input.txt output.
这将使用每个后缀5个字符,足以容纳265 = 11881376个文件。如果您的文件数量超过了这个限制,请增加后缀长度。
while IFS= read -r line; do
do_something_with "$line"
done < big.file
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