我正在尝试将一个大文本文件拆分为几个文本文件。我发现了几年前的另一个帖子,有一个非常相似的前提,但找不到我的确切情况。
https://unix.stackexchange.com/a/64691/183674如果第一行不是以00:00:00:00开头,我该如何分割下面的数据?
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
下面是供参考的代码:
#!/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);
我尝试在while语句后的下一行添加print $line;
,以尝试使其逐行读取,如其他教程中所示,但这并没有纠正这个问题。
我将感谢任何输入。
编辑:对于像
这样的例子 00:01:16:17 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 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
丢弃前三行
像这样修改循环中的条件不能完成工作吗?
if ($line =~ /^00:00:00:00/ || !$outfh)
假设第一行不以00:00:00:00
开头(' 0标记')。regex匹配失败,但文件未打开,因此|| !$outfh
条件为真。if
主体中的代码跳过关闭并打开新文件,并将该行写入新文件。此后,文件打开,因此条件的后半部分不会改变决策制定(除了略微减慢决策制定速度,而且可能是不可估量的)。
自从我第一次提出我的解决方案后,问题就被澄清了。如果要丢弃第一个零标记之前的行,请将打印修改为仅在文件句柄打开时才打印(而不是修改后的条件,如果第一行不是以零标记开始,则打开文件)。
print $outfh $line or die "Failed to write to file: $!" if $outfh;