아래 예와 같이 대용량 파일을 작은 하위 파일로 분할하는 방법에 대한 도움이 필요합니다.
표준은 오프셋 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