我需要您的帮助来了解如何将大文件拆分为小子文件,如下例所示。
标准是我们正在查看偏移量 30(第 31 个字节到 2 个字节)。如果偏移量包含 0A,则应将记录复制到文件 A,如果其为 0B @ 32,则应将其复制到文件 B,如果其为 0C,则应将其复制到文件 C
输入文件示例:
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110C11111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
输出文件A:
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
输出文件B:
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
输出文件C:
1111111111111111111111111111110C11111111111111111111111
答案1
对于每一行,您都可以使用它 substr($line,30,2)
来获取您想要的两个字符。所以像
#!/usr/bin/perl
use warnings;
use strict;
open(my $file1,">file1");
open(my $file2,">file2");
open(my $file3,">file3");
while(<>)
{
my $ch=substr($_,30,2);
if ($ch eq '0A') { print $file1 $_; }
elsif ($ch eq '0B') { print $file2 $_; }
elsif ($ch eq '0C') { print $file3 $_; }
else { print "Bad line skipped: $_"; }
}
我们可以看到它的实际效果:
$ cat input
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110C11111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
$ ./script input
$ cat file1
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
$ cat file2
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
$ cat file3
1111111111111111111111111111110C11111111111111111111111
答案2
$ perl -ne '
$filename = substr($_,30,2);
open $fh{$filename}, ">", $filename unless exists $fh{$filename};
print {$fh{$filename}} $_
' file
$ cat 0A
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
$ cat 0B
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
$ cat 0C
1111111111111111111111111111110C11111111111111111111111