Perl을 사용하여 텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

Perl을 사용하여 텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

다음 내용이 포함된 ABC_TabDelim.txt 파일이 있습니다.

00:00:00:00 00:00:05:00 01SC_001.jpg
00:00:14:29 00:00:19:29 01SC_002.jpg
00:01:07:20 00:01:12:20 01SC_003.jpg
00:00:00:00 00:00:03:25 02MI_001.jpg
00:00:03:25 00:00:08:25 02MI_002.jpg
00:00:35:27 00:00:40:27 02MI_003.jpg
00:00:00:00 00:00:05:00 03Bi_001.jpg
00:00:05:19 00:00:10:19 03Bi_002.jpg
00:01:11:17 00:01:16:17 03Bi_003.jpg
00:00:00:00 00:00:05:00 04CG_001.jpg
00:00:11:03 00:00:16:03 04CG_002.jpg
00:01:12:25 00:01:17:25 04CG_003.jpg

00:00:00:00 각 인스턴스에 대해 여러 파일로 분할하여 ABC01_TabDelim.txt, ABC02_TabDelim.txt, ABC03_TabDelim.txt 등으로 출력하고 싶습니다.

따라서 00:00:00:00은 새 파일이 시작되어야 함을 의미합니다. Perl 스크립트를 사용하여 이를 수행할 수 있는 방법이 있습니까?

답변1

이것은 주어진 형식에서 작동합니다. 이는 파일이 항상 00:00:00:00으로 시작한다고 가정합니다.

#!/usr/bin/env perl

use strict;
use warnings;

open(my $infh, '<', 'ABC_TabDelim.txt') or die $!;

my $outfh;
my $filecount = 0;
while ( my $line = <$infh> ) {
    if ( $line =~ /^00:00:00:00/ ) {
        close($outfh) if $outfh;
        open($outfh, '>', sprintf('ABC%02d_TabDelim.txt', ++$filecount)) or die $!;        
    }
    print {$outfh} $line or die "Failed to write to file: $!";
}

close($outfh);
close($infh);

답변2

여기요. 오류 검사 없이 다음과 같이 실행합니다.perl split file-to-munge

고쳐 쓰다:스크립트 정리에 대해서는 Goldilocks의 조언을 따르십시오.

#!/usr/bin/perl

$n = 1;
while(<>) {
    if(/^00:00:00:00/) {
        close($out) if(n != 1);
        $fn = sprintf("ABC%02d_TabDelim.txt", $n++);
        open($out, ">", "$fn");
    }
    print OUT;
}

답변3

이 예제 입력의 출력이 4개의 파일로 예상되는 경우 각 파일에는 3개의 라인이 있고 각 라인의 첫 번째 라인은 "00:00:00:00"으로 시작하고 나머지 2개의 라인은 다음과 같습니다.

perl -ne 'if(/^[0:]{11}/){close F if$f;open F,sprintf(">ABC%02d_TabDelim.txt",++$f)}print F' ABC_TabDelim.txt

답변4

awk를 사용하여 구현할 수 있는 한 가지 방법인 Perl 솔루션이 있습니다.

awk '/00:00:00:00/ { out = sprintf("ABC%02d_TabDelimit.txt", ++i) } { print > out }' ABC_TabDelim.txt

나누어야 한다면많은각 파일이 진행되는 동안 닫히도록 하려면 sprintf 함수 앞에 다음을 추가하십시오 if(out) close(out).

awk '/00:00:00:00/ { if(out) close(out); out = sprintf("ABC%02d_TabDelimit.txt", ++i) } { print > out }' ABC_TabDelim.txt

관련 정보