如何将文件拆分成较小的文件(每行一个文件)[拆分不起作用]

时间:2013-10-04 14:36:36

标签: bash split

我正在尝试将每个行的一个非常大的文件拆分为一个新文件。

为什么呢?这将是Mahout的输入。但是有太多的行和没有足够的后缀用于拆分。

有没有办法在bash中执行此操作?

4 个答案:

答案 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"

使用Xargs

然而,无论如何,上面真的只是一个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