Perl 脚本根据特定偏移量的模式分割文件

Perl 脚本根据特定偏移量的模式分割文件

我需要您的帮助来了解如何将大文件拆分为小子文件,如下例所示。

标准是我们正在查看偏移量 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

相关内容