我有170个1GB的二进制文件,我想在每次找到特定的ASCII字符串时拆分它们。其中一些字符串也有换行符。
csplit
接缝就像完成此任务的完美工具一样,但它接触它并不适用于二进制文件。
问题
如果我将搜索字符串转换为十六进制/二进制,这是否会使问题更容易解决,所以它是二进制数据中的二进制搜索?
如果没有,我如何拆分基于ASCII字符串的二进制文件,其中一些字符串有换行符?
答案 0 :(得分:2)
除了二进制文件通常包含不会出现在文本文件中的数据之外,二进制文件没有什么特别之处,而且打印时它们看起来并不好看。它们仍然是一系列必须被理解的八位字节,大多数体面的语言都可以让你做到这一点。
一个例子可能有帮助。
您没有描述要用作分隔符的字符串,并且在读取完每个块后,您不会说出要对每个块执行的操作,所以这是一个Perl程序,读取以specific ASCII string
结尾的块中的1GB原始文件,并将它们一次写入一个新文件。所以它相当笨拙地复制文件。
use strict;
use warnings;
open my $fh, '<:raw', '1GBfile' or die $!;
local $/ = 'specific ASCII string';
open my $out_fh, '>:raw', 'new1GBfile' or die $!;
select $out_fh;
print while <$fh>;
close $out_fh or die $!;
根据您对文件中的数据执行的操作,您可能会发现File::Map
有用
答案 1 :(得分:1)
您可以将输入记录分隔符$/
更改为要分割的特定搜索字符串(默认情况下,它是换行符)。然后在阅读输入文件时,将每条记录打印到一个新的唯一文件:
#!/usr/bin/perl
use strict;
use warnings;
# change the input record separator to whatever string you want
$/ = "SOME STRING";
my $file_num = 0;
while (my $data = <>) {
chomp $data; # remove input record separator
my $file = "file." . ++$file_num;
open my $fh, '>', $file or die "can't open file: $file: $!\n";
print $fh $data;
close $fh;
}