【问题标题】:Concatenate huge amount of files in chunks using zsh使用 zsh 以块的形式连接大量文件
【发布时间】:2020-06-10 22:51:57
【问题描述】:

我正在尝试解决一种将大量(200 万)文本文件连接成 100k 文件块的有效方法。

现在我有

!#/usr/bin/zsh
a=0
b=0
for file in ./dir/*.txt
do
    let a+=1
    cat "$file" >> $results$b.txt
    if (($a>10000))
    then
        let b+=1
        let a=0
    fi
done

我不知道如何以“快速”的方式制作 chuks?我机器中的这段代码大约需要 2 分钟来处理块,并且需要大约 200 个块,所以大约需要 7 个小时。这是一件我需要做一次的事情,所以它不是世界末日,但我喜欢更好地学习和思考,并以更有效的方式去做。

谢谢

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 一种方法是使用 GNU 并行和 GNU 拆分:parallel 'cat | split -b 100000' ::: *.txt
  • 您使用的是 bash 还是 zsh(虽然我怀疑这对任何答案都很重要,但您应该适当地标记)?
  • 太糟糕了,downvoters 没有解释这个 Q 有什么问题(他们可能不会再看它,所以我们永远不会知道)。对于早期的 Q,这表明了解决您的问题的有意义的尝试,并包含一些代码(喘气!)。我不明白。很抱歉接待不好,祝您好运解决您的问题。

标签: zsh


【解决方案1】:

老实说,如果您希望在有这么多文件的情况下获得不错的性能,我不会使用 shell 脚本。

(未经测试的)perl 应该像你想要的那样连接文件:

#!/usr/bin/env perl
use strict;
use warnings;

my $nfiles = 0;
my $n = 0;
my $out;

while (my $file = glob "./dir/*.txt") {
    if ($nfiles++ % 100000 == 0) {
        open $out, ">:raw", "results$n.txt"
            or die "Unable to open results$n.txt: $!\n";
        $n += 1;
    }
    open my $tmp, "<:raw", $file or die "Unable to open $file: $!\n";
    print $out do { local $/; <$tmp> };
}

【讨论】:

  • 谢谢,但我试了一下,第一个块做得很快,然后真的很慢。
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2014-04-21
  • 1970-01-01
  • 2013-09-12
  • 2017-09-01
相关资源
最近更新 更多