在Linux中将文件分割成不等大小的块

7

我希望将一个拥有约1700万行字符串的大型文件分割成多个文件,每个文件中包含不同数量的行。我是否可以像这样向'split -l'命令发送一个数组:

[
 1=>1000000,
 2=>1000537,
 ...
]

为了将这么多行发送到每个块中。
3个回答

11

使用复合命令:

{
  head -n 10000 > output1
  head -n   200 > output2
  head -n  1234 > output3
  cat > remainder
} < yourbigfile

这也适用于循环:

{
  i=1
  for n in 10000 200 1234
  do
      head -n $n > output$i
      let i++
  done
  cat > remainder
} < yourbigfile

在 OS X 上该方法无效,因为 head 会读取并丢弃额外的输出内容。


我已经尝试过这个,但是无法使其工作。它必须是特定的 shell 吗?这是我的输出 pastiebin - sotapme
必须使用不会读取并丢弃输出的“head”。 GNU coreutils head 如果读取过多,将进行回溯。 - that other guy
你可能想把这个加到你的答案里 - 因为我的闪亮 Mac 没有做正确的事情。 - sotapme

1
您可以使用sed通过获取另一个脚本来为您生成sed命令。
# split_gen.py
use strict;
my @limits = ( 100, 250, 340,999);
my $filename = "joker";

my $start = 1;
foreach my $end (@limits) {
    print qq{sed -n '$start,${end}p;${end}q' $filename > $filename.$start-$end\n};
    $start = $end + 1;
}

运行以下命令:perl split_gen.py,将得到如下结果:

sed -n '1,100p;100q' joker > joker.1-100
sed -n '101,250p;250q' joker > joker.101-250
sed -n '251,340p;340q' joker > joker.251-340
sed -n '341,999p;999q' joker > joker.341-999

如果您对该命令感到满意,那么您可以执行它。
perl split_gen.py | sh 

然后请耐心等待,因为处理大文件可能会比较慢。

1
< p > split 命令没有这种能力,所以您需要使用另一个工具或编写自己的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接