如何使用 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

更新:按照金发姑娘的建议进行脚本清理

#!/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

你有一个 perl 的解决方案,这是你可以使用 awk 实现的一种方法:

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

相关内容