我正在尝试将每个行的一个非常大的文件拆分为一个新文件。
为什么呢?这将是Mahout的输入。但是有太多的行和没有足够的后缀用于拆分。
有没有办法在bash中执行此操作?
答案 0 :(得分:3)
如果您坚持使用拆分,则必须增加后缀长度。例如,假设您的文件中有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"
然而,无论如何,上面真的只是一个kludge。更正确的解决方案是使用GNU findutils包中的 xargs 来每行调用一次命令。例如:
xargs --max-lines=1 --arg-file=foo.txt your_command
这将一次传递一行到您的命令。这是一种更灵活的方法,可以大大减少磁盘I / O.
答案 1 :(得分:2)
split --lines=1 --suffix-length=5 input.txt output.
这将使用每个后缀5个字符,这足以容纳26个 5 = 11881376个文件。如果你真的有更多,增加后缀长度。
答案 2 :(得分:1)
这是另一种为每一行做某事的方法:
while IFS= read -r line; do
do_something_with "$line"
done < big.file
答案 3 :(得分:1)
GNU Parallel可以做到这一点:
cat big.file | parallel --pipe -N1 'cat > {#}'
但是如果Mahout可以从stdin读取,那么你可以避免使用临时文件:
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