특정 오프셋의 패턴을 기반으로 파일을 분할하는 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

관련 정보