3

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

为什么?它将作为 Mahout 的输入。但是有太多的行,没有足够的后缀进行拆分。

有没有办法在 bash 中做到这一点?

4

4 回答 4

4

通过拆分增加后缀长度

如果你坚持使用拆分,那么你必须增加你的后缀长度。例如,假设您的文件中有 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

但是,无论如何,上述内容实际上只是一个杂牌。更正确的解决方案是使用GNU findutils 包中的xargs每行调用一次命令。例如:

xargs --max-lines=1 --arg-file=foo.txt your_command

这将一次将一行传递给您的命令。这是一种更加灵活的方法,将大大减少您的磁盘 I/O。

于 2013-10-04T14:51:44.500 回答
2
split --lines=1 --suffix-length=5 input.txt output.

这将使用每个后缀 5 个字符,这对于 26个 5 = 11881376 个文件来说已经足够了。如果你真的有更多,增加后缀长度。

于 2013-10-04T14:44:25.480 回答
1

这是为每一行做一些事情的另一种方法:

while IFS= read -r line; do
    do_something_with "$line"
done < big.file
于 2013-10-04T16:46:59.653 回答
1

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

于 2013-10-04T17:21:59.863 回答